一、错误
从软件方面来说, 错误是语法或是逻辑上的。语法错误指示软件的结构上有错误,导致不能被解释器解释或编译器无法编译。
当程序的语法正确后, 剩下的就是逻辑错误了。逻辑错误可能是由于不完整或是不合法的输入所致;在其他情况下, 还可能是逻辑无法生成,计算,或是输出结果需要的过程无法执行。这些错误通常分别被称为域错误和范围错误。
二、异常
程序出现了错误而在正常控制流以外采取的行为。这个行为又分为两个阶段: 首先是引起异常发生的错误,然后是检测(和采取可能的措施)阶段。
第一个阶段是在发生了一个异常条件(有时候也叫做例外的条件)后发生的。只要检测到错误并且意识到异常条件, 解释器会引发一个异常。当前流将被打断, 用来处理这个错误并采取相应的操作。
对异常的处理发生在第二阶段,异常引发后, 可以调用很多不同的操作。可以是忽略错误(记录错误但不采取任何措施,采取补救措施后终止程序),或是减轻问题的影响后设法继续执行程序,所有的这些操作都代表一种继续,或是控制的分支。
三、检测和处理异常
异常可以通过 try 语句来检测。任何在 try 语句块里的代码都会被监测,检查有无异常发生。
try 语句有两种主要形式:try-except 和 try-finally,这两个语句是互斥的,一个 try 语句可以对应一个或多个 except 子句,但只能对应一个finally 子句,或是一个 try-except-finally 复合语句。
1、try-except 语句
它 由 try 块 和 except 块 (try_suite 和except_suite )组成,也可以有一个可选的错误原因
try:
try_suite # watch for exceptions here 监控这里的异常
except Exception[, reason]:
except_suite # exception-handling code 异常处理代码
2、封装内建函数
我们的目标是"安全地"调用 float() 函数,或是使用一个"安全的方式" 忽略掉错误,因为它们与我们转换数值类型的目标没有任何联系,而且这些错误也没有严重到要让解释器终止执行。
def safe_float(obj): try: retval = float(obj) except ValueError: retval = 'could not convert non-number to float' except TypeError: retval = 'object type cannot be converted to float' return retval
3、带有多个 except 的 try 语句
该种异常处理语法的规则是:
· 执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。
· 如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。
· 如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。
· 如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
· 如果没有发生异常,则执行else块代码。
我们还可以在一个 except 子句里处理多个异常
def safe_float(obj): try: retval = float(obj) except (ValueError, TypeError): retval = 'argument must be a number or numeric string' return retval
4、捕获所有异常
try:
:
except Exception as e:
print('reason:',e)
5、异常参数
异常也可以有参数,异常引发后它会被传递给异常处理器,当异常被引发后参数是作为附加帮助信息传递给异常处理器的,要想访问提供的异常原因,你必须保留一个变量来保存这个参数。