-
异常和错误
-
错误和异常
-
从软件方面来说,错误是语法或者逻辑上的,语法错误指示软件的结构上有错误,导致不能被解释器解释。当程序的语法正确后,剩下的就是逻辑错误了,逻辑错误可能是由于不完整或者不合法的输入所致。当Python检测到一个错误时,解释器就会指出当前流无法继续执行下去,这就出现了异常。
对异常的描述是:它是因为程序出现了错误而在正常控制流以外采取的行为,这个行为又分为两个阶段:首先是引起异常发生的错误,然后是检测(和采取可能的措施)阶段。
第一个阶段是发生在一个异常条件后发生的,只要检测到错误并且意识到异常条件,解释器就会触发一个异常。解释器通知当前控制流有错误发生。异常就是错误发生的信号,当前流被打断,用来处理这个错误并采取相应的操作。这就是第二阶段。
对异常的处理发生在第二阶段,异常引发后,可以调用不同的操作,可以忽略错误,或是减轻问题的影响后设法继续执行,所有的这些操作都是代表一种继续,或是控制的分支。关键是程序员在错误发生时可以指示程序如何执行。
-
Python中的异常
- NameError:尝试访问一个未声明的变量
- ZeroDivisionError:除数为0
- SyntaxError:Python解释器语法错误
- IndexError:请求的索引超出序列范围
- KeyError:请求一个不存在的字典关键字
- IOError:输入/输出错误
- AttributeError:尝试访问未知的对象属性
-
检测和处理异常
-
异常可以通过try语句来检测,任何在try语句块中的代码都会被检测,检测有无异常发生。
try语句有两种主要的形式:try-except和try-finally语句。这两个语句是互斥的,只能使用其中的一个。一个try语句可以对应一个或多个except语句,但只能对应一个finally语句,或者是一个try-except-finally复合语句。
-
try-except语句
try-except语句(以及更复杂的形式)定义了进行异常监控的一段代码,并且提供了异常处理的机制。
常见的语法格式如下:
try try_suite #监控这里的异常 except Exception[, reason]: except_suite #异常处理的代码 |
举例: >>> try: ... f = open(‘bla‘, ‘r‘) ... except IOError, e: ... print ‘could not open file‘, e ... could not open file [Errno 2] No such file or directory: ‘bla‘ |
程序运行时,解释器尝试执行try里面的语句块,如果代码块执行后没有发生错误,执行流会忽略except语句继续执行,当except语句所指定的异常发生后,保存下错误的原因,控制流立即跳转到对应的处理器(try子句的剩余语句将被忽略)。
-
带有多个except的try语句
可以把多个except语句连接在一起,处理一个try块中可能发生的多种异常。如下:
try try_suite #监控这里的异常 except Exception1 [, reason]: suite_for_exception_Exception1 except Exception2 [, reason]: suite_for_exception_Exception2? |
首先执行try子句,如果没有错误,忽略所有的except从句继续执行,如果发生异常,解释器将在这一串处理器(except子句)中查找匹配的异常,如果找到对应的处理器,执行流将跳转到这里。
-
处理多个异常的except语句
可以在一个except子句里处理多个异常,except语句在处理多个异常时要求异常被放在一个元组里:
except (Exception1, Exception2) [, reason]:
suite_for_Exception1_and_Exception2
事实上except语句可以处理任意多个异常,前提只是他们放在一个元组里,如下:
except (Exc1,[, Exc2 [, … ExcN]]) [, reason]:
suite_for_exceptions_Excl_to_ExcN
-
捕获所有异常
异常是遵循继承结构的,Exception是在最顶层。
try:
;
except Exception. e:
#error occurred, etc.
Python2.5,异常被迁移到了新式类上,启用了一个新的"所有的异常之母",这个类叫做BaseException,KeyboardInterrupt和SystemExit和Exception同级了。如果需要捕获所有的异常,格式如下:
try:
;
except BaseException, e:
#error occurred, etc.
-
"异常参数"
异常也可以有参数,异常引发后会被传递给异常处理器。当异常被引发后参数是作为附加帮助信息传递给异常处理器的。标准内建异常提供至少一个参数,指示异常原因的一个字符串。添加异常参数的except扩展语法如下:
except (Exception1, Exception2, …, ExceptionN), [, reason):
suite_for_Exception1_to_ExceptionN_with_Argument
异常参数自身组成一个元组,并存储为类实例(异常类的实例)的属性。
? #!/usr/bin/env python ? def safe_float(obj): ‘safa version of float()‘ try: retval = float(obj) except (ValueError, TypeError), diag: retval = str(diag) return retval ? def main(): ‘handle all the data processing‘ log = open(‘cardlog.txt‘, ‘w‘) try: ccfile = open(‘carddata.txt‘, ‘r‘) except IOError, e: log.write(‘no txns this month\n‘) log.close() return txns = ccfile.readlines() ccfile.close() total = 0.00 log.write(‘account log:\n‘) ? for eachTxn in txns: result = safe_float(eachTxn) if isinstance(result, float): total += result log.write(‘data... processed\n‘) else: log.write(‘ignord: %s‘ % result) print ‘$%.2f (new balance)‘ % (total) log.close() ? if __name__ == ‘__main__‘: main() |
-
else子句
在try范围内没有异常被检测到时,执行else子句。在else范围中的任何代码执行前,在try范围中的所有代码必须完全成功。
try:
;
except Exception. e:
#error occurred, etc.
else:
;
-
finally子句
finally子句是无论异常是否发生,是否捕捉都会执行的一段代码。语法示例如下:
try:
try:
A
except MyException:
B
else:
C
finally:
D
-
try-except-else-finally语句
综合所有不同的可以处理异常的语法样式如下:
try:
try_suite
except Exception1:
suite_for_Exception1
except (Exception2, Exception3, Exception4):
suite_for_Exception2_3_and_4
except Exception5, Argument5:
原文地址:https://www.cnblogs.com/mrlayfolk/p/12024341.html