正常状态如何获得TraceBack?
当有异常发生时,可以利用sys.exc_info()获得异常发生点的TraceBack。但正常状态如何获得TraceBack呢?查了很久资料都没有找到答案。
想来想去,只找到两种不完美的方案:
【方案一】
主动引发一个异常,从而获得其TraceBack。事实上,traceback.extract_stack里就是这么干的:
1 def extract_stack(f=None, limit = None):
2
3 if f is None:
4 try:
5 raise ZeroDivisionError
6 except ZeroDivisionError:
7 f = sys.exc_info()[2].tb_frame.f_back
8
2
3 if f is None:
4 try:
5 raise ZeroDivisionError
6 except ZeroDivisionError:
7 f = sys.exc_info()[2].tb_frame.f_back
8
这种强行引发异常的方法,肯定会降低性能。
【方案二】
利用sys.settrace,自行对调用堆栈进行跟踪。大致这样来做:
1 def mytrace(frame, event, args):
2 if (event == 'call'):
3
4 elif (event == 'return'):
5
6 sys.settrace(mytrace)
2 if (event == 'call'):
3
4 elif (event == 'return'):
5
6 sys.settrace(mytrace)
这样做,所有的调用都会额外地引发这段自定义处理,显然也会严重影响性能。
上面两种方案看来只能应用在Debug环境中。不知道有没有安全、高效的方法……