2012-10-09 27 views
3

在Python 2.x中,傳遞到settrace處理函數的框架對象具有f_exc_type屬性。處理settrace「返回」調用中的異常

在Python 3.x中,這個f_exc_type已被刪除。

如果一個函數正在傳播一個異常,調用跟蹤'return',但參數是Nonesys.exc_info()(None,None,None)。這在docs中描述:

[return]函數(或其他代碼塊)即將返回。調用本地跟蹤 函數; arg是將返回的值,或者如果事件是由引發異常引起的,則爲無。跟蹤功能的 返回值被忽略。

在Python 3中,示蹤劑如何確定return鉤子中正在傳播異常?它如何區分它通常返回None的函數?

回答

2

這確實看起來相當破碎。這有點破解,但你可以通過查看最後指令的字節碼來區分它們:

import opcode 

def tracer(frame, event, arg): 
    if event == 'return': 
     if arg is not None or (opcode.opname[frame.f_code.co_code[frame.f_lasti]]] 
           in ('RETURN_VALUE', 'YIELD_VALUE')): 
      print('exit via return', arg) 
     else: 
      print('exit via exception') 
+0

讓我發抖,但它確實有效!謝謝! https://github.com/williame/obiwan/commit/b67a9c02efb38ccad1aec417c324a1ceb8a9a46f – Will