當有異常發生時,可以利用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
這種強行引發異常的方法,肯定會降低性能。
【方案二】
利用sys.settrace,自行對調用堆棧進行跟蹤。大致這樣來做:
1 def mytrace(frame, event, args):
2 if (event == 'call'):
3
4 elif (event == 'return'):
5
6 sys.settrace(mytrace)
這樣做,所有的調用都會額外地引發這段自定義處理,顯然也會嚴重影響性能。
上面兩種方案看來只能應用在Debug環境中。不知道有沒有安全、高效的方法……
本文作者:未知