17.2.7.4 异常传播
可以在一个局部跟踪函数中查找exception事件以监视异常。出现异常时,会调用跟踪hook并提供一个元组,其中包含异常类型、异常对象和一个traceback对象。
#!/usr/bin/env python3
# encoding: utf-8
import sys
def trace_exceptions(frame,event,arg):
if event != 'exception':
return
co = frame.f_code
func_name = co.co_name
line_no = frame.f_lineno
exc_type,exc_value,exc_traceback = arg
print('* Tracing exception:\n'
'* {} "{}"\n'
'* on line {} of {}\n'.format(
exc_type.__name__,exc_value,line_no,
func_name))
def trace_calls(frame,event,arg):
if event != 'call':
return
co = frame.f_code
func_name = co.co_name
if func_name in TRACE_INFO:
return trace_exceptions
def c():
raise RuntimeError('generating exception in c()')
def b():
c()
print('Leaving b()')
def a():
b()
print('Leaving a()')
TRACE_INFO = ['a','b','c']
sys.settrace(trace_calls)
try:
a()
except Exception as e:
print('Exception handler:',e)
要注意应用局部函数的限制,因为格式化错误消息的一些内部函数会生成自己的异常并将其忽略。不论调用者是否捕获和忽略异常,每个异常都会被跟踪hook看到。