嵌套异常处理器
try语句可以是嵌套的,一个try语句中,可以有其它try语句。
当异常发生时,Python会进入“最近”的try语句并拦截该异常、相符的try语句,只有第一个拦截到该异常的try语句(except分句)会对异常进行处理。如果没有拦截到异常,则会一层层往上传递:
这种异常的传递只要碰到except子句就会停止,而通过finally语句就会不,它会始终向上传递异常。
异常的习惯用法
- 异常不总是错误
在Python中所有的错误都是异常,但不是所有的异常都是错误。比如读取文件时,在文件末尾会引发内置的EOFError,这种情况下,该异常不是错误,只是一个文件末尾终止的信号。 - 函数信号条件和raise
可以在编程时,用异常来做程序的流程管理,比如让一个处理函数抛出自定义的异常而不是返回一个状态来表示数据处理的结果。 - 用try语句进行调试
也可以用try语句异常处理器,取代Python默认顶层异常处理行为。
try:
programm goes here ...
except:
import sys
print("uncaught!",sys.exc_info()[0],sys.exc_info()[1])
这种结构在开发期间经常使用,在错误发生后,仍保持程序处于激活状态:这样可以执行其他测试,而不用重新开始。
- 运行进程中的测试
利用Python异常的处理方法,可以让Python在整个进程中对一些接口模块进行测试,将异常信息抓取下来。而不至于让整个测试进程停止:
import sys
log = open('testlog','a')
from testapi import moreTests,runNext,TestName
def testdriver():
while moreTests():
try:
runNext()
except:
print('FAILED',testName(),sys.exc_info()[:2],file=log)
else:
print('PASSED',testName(),file=log)
testdriver()
在这里testdriver会循环运行一组测试调用,在测试用例失败或成功后都会记录进入日志文件中,而不是失败就退出程序停止执行。在上面这段程序中可以看到,可以用sys.exc_info()函数获取异常处理器对最近引发的异常访问。
try语句的使用
try语句中应该包含哪些代码?这主要有以下几个基本原则:
- 经常会失败的运算一般都应该包含在try语句内
- 尽管这样,要考虑到Python遇到一些重大异常时,希望Python停止运行,并输出错误信息,而不是通过try语句忽略错误
- 应该在finally中实现终止行为,保证Python程序的正确运行。
- 把函数的调用方在try语句内,而不是将函数实现都放在try语句中,这样会更方便。
- 避免是用空的except分句,这将捕捉所有无关异常,避免异常捕捉过于广泛。
- 避免except分句捕捉太少,多使用基于类的异常分类,捕捉具有普遍性的异常时,使用异常超类用于except分句。所以异常设计不要过于一般化,也不要过于太具体化。