2012-10-09 4 views
3

파이썬 2.x에서 settrace 핸들러로 전달 된 프레임 객체는 f_exc_type 속성을가집니다.settrace 'return'호출에서 예외 처리

파이썬 3.x에서이 f_exc_type이 삭제되었습니다.

함수가 예외를 전파하는 경우 'return'추적이 호출되지만 인수는 None이고 sys.exc_info()(None,None,None)입니다. 이것은 docs에 설명되어 있습니다.

[return] 함수 (또는 다른 코드 블록)가 반환되기 직전입니다. 로컬 추적 함수가 호출됩니다. arg는 반환 될 값이거나 인 경우 None입니다. 예외 발생으로 인해 이벤트가 발생합니다. 추적 함수의 반환 값은 무시됩니다.

파이썬 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