8.4.1 断言
语法:
assert expression[, reason]
当表达式 expression 为真时,什么也不做;为假时,抛出异常。
断言与异常经常结合起来使用。
>>> try:
assert 1==2, "1 is not equal 2!"
except AssertionError as reason:
print("%s:%s"%(reason.__class__.__name__, reason))
AssertionError:1 is not equal 2!
8.4.2 上下文管理
上下文管理语句 with 可以自动管理资源,在代码执行完毕后还原进入改代码之前的现场或上下文。
>>> with open('sample.txt') as f:
for line in f:
print(line)
8.5 用 sys 模块回溯异常
sys.exc_info() 的返回值是一个三元组 (type, value/message, traceback)。type 表示 异常的类型,value 表示异常的信息或参数,traceback 则包含调用栈信息的对象。
>>> import sys
>>> try:
1/0
except:
r = sys.exc_info()
print(r)
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x038E7DA8>)
下面代码演示了异常跟踪和 sys.exc_info() 之间的区别。sys.exc_info() 可以直接定位最终发生异常的原因,缺点是难以直接确定引发异常的代码位置。
>>> def A():
1/0
>>> def B():
A()
>>> def C():
B()
>>> C()
Traceback (most recent call last):
File "<pyshell#124>", line 1, in <module>
C()
File "<pyshell#122>", line 2, in C
B()
File "<pyshell#119>", line 2, in B
A()
File "<pyshell#116>", line 2, in A
1/0
ZeroDivisionError: division by zero
>>> try:
C()
except:
r = sys.exc_info()
print(r)
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x038EA648>)