2016-08-01 2 views
0

필자의 이해는 다음과 같습니다. 일반적으로 오류가 발생하면 모든 호출 함수를 통해 오류가 발생하여 콘솔에 표시됩니다. 이제는 자체적 인 오류 처리를 수행하는 패키지가 있는데, 특히 GUI 관련 패키지는 종종 오류를 표시하지 않지만 예외를 계속 수행합니다.mpl_connect() 콜백 함수에 오류 메시지를 표시하는 방법

어떻게 이러한 동작을 일반적으로 무시할 수 있습니까? GUI 함수를 작성할 때 오류를보고 싶습니다! 내가 찾은 this post 어디에 Tkinter의 경우 그것을 어떻게 설명했다. 이것이 Matplotlib에서 어떻게 할 수 있습니까?

예제 코드 : 파이썬 인터프리터 잡은 결코 예외가 발생

실제로
import matplotlib.pyplot as plt 

def onclick(event): 
    print(event.x, event.y) 
    raise ValueError('SomeError') # this error is thrown but isn't displayed 

fig = plt.figure(5) 
fig.clf() 

try: # if figure was open before, try to disconnect the button 
    fig.canvas.mpl_disconnect(cid_button) 
except: 
    pass 
cid_button = fig.canvas.mpl_connect('button_press_event', onclick) 

답변

1

, 그것은 흥분하기 전에 표준 출력 할 수있는 소위 역 추적을 인쇄합니다. 그러나 GUI 패키지는 일반적으로 파이썬 인터프리터가 흥미 진진하지 못하도록 모든 예외를 잡아서 삼킨다. 그 추적 표시를 어딘가에 표시하고 싶지만 GUI 응용 프로그램의 경우 추적 표시 위치를 결정해야합니다. 표준 라이브러리에는 해당 추적 작업에 도움이되는 모듈이 있습니다. 적절하게 이름이 traceback입니다. 그런 다음 GUI 도구 키트에서 예외를 catch해야합니다. 콜백 오류 처리기를 삽입하는 일반적인 방법을 모르지만 각 콜백에 오류 처리를 수동으로 추가 할 수 있습니다. 이렇게하는 가장 좋은 방법은 함수 데코레이터를 작성하여 콜백에 적용하는 것입니다.

import traceback, functools 

def print_errors_to_stdout(fun): 
    @functools.wraps(fun) 
    def wrapper(*args,**kw): 
     try: 
      return fun(*args,**kw) 
     except Exception: 
      traceback.print_exc() 
      raise 
    return wrapper 

@print_errors_to_stdout 
def onclick(event): 
    print(event.x, event.y) 
    raise ValueError('SomeError') 

데코레이터 print_errors_to_stdout 함수를 취하고 try ... except 블록의 본래의 기능을 내장하고 예외의 경우 traceback.print_exc()의 도움으로 표준 출력하는 트레이스 백을 출력하는 새로운 기능을 리턴한다. 래퍼 자체는 functools.wraps으로 장식되어 생성 된 래퍼 함수가 원래 함수의 docstring을 유지합니다. 만약 당신이 어딘가에 추적을 보여주고 싶다면 traceback.format_exc()는 당신에게 문자열을 줄 것입니다. 그러면 문자열을 보여주고 저장할 수 있습니다. 데코레이터는 또한 예외를 재현하여 GUI 툴킷이 여전히 예외를 삼키는 자체 액션을 취할 수있는 기회를 얻습니다.

관련 문제