检测和处理异常
异常可以通过Try 语句来检测。任何在try语句里的代码都会被监测,检查有无异常发生。
try语句有两种形式:try-except 和try-finally。
这两个语句是互斥的,也就是说你只能使用其中的一个。
一个try语句可以对应一个或多个except 子句,但只能对应一个finally子句,或是一个try-except-finally符合语句。
你可以使用try-except语句检测和处理异常。你也可以添加一个可选的else 子句处理没有检测到异常的执行的代码。
try-finally只允许检测异常并做一些必要的清除工作(无论发生错误与否),没有任何异常处理措施。
try-except语句
try-except语句定义了进行异常监控的一段代码,并且提供了处理异常的机制。
try:
try_suit #监控这里的异常
except exception【,reason】:
except_suit #异常处理代码
>>> f=open("blan")
Traceback (most recent call last):
File "
f=open("blan")
FileNotFoundError: [Errno 2] No such file or directory: 'blan'
我们用一个例子说明这是如何工作的。我们将使用上面的IOError例子,把我们的代码封装在try-except里,让代码更健壮。
>>> try:
f = open('blan','r')
except(IOError):
print("could not open file:")
could not open file:
如上所述,我们的代码运行时似乎没有遇到任何错误。
事实上我们的代码在尝试打开一个不存在的文件时仍然发生了IOError。
那么上述两段代码有什么区别呢?第二断程序我们加入了错误检测和处理的代码。当引发IOError异常时,我们告诉解释器让他打印出一条异常信息。此时程序继续执行下去。
在程序运行时,解释器尝试执行try块里的所有代码,如果代码块完成后没有任何异常发生,执行流就会忽略except语句继续执行。
而当except语句所指定的异常发生后,我们保存了错误的原因,控制流立即跳转到对应的处理器(try语句剩余的语句将被忽略)。
try语句块中异常发生的点后的剩余语句将永远不会到达(所以也永远不会执行)。
一旦一个异常被引发,就必须决定控制流下一步到达的位置。剩余代码将被忽略。解释器将搜索处理器,一旦找到,就开始执行处理器中的代码。
如果没有找到合适的处理器,那么异常就将向上移交给调用者去处理,着意味着堆栈框架回到之前的哪一个。
如果在上层调用者也没有找到对应的处理器,该异常将会继续向上移交,知道找到合适的处理器。
如果到达最顶层仍然没有找到合适的处理器,Python显示器会显示出跟踪记录,然后退出。