2013-08-28 2 views
1

except: 블록 내에서 예외를 발생 시키려고하는데 해석기가 도움이되고 스택 추적을 '강제로'인쇄합니다. 이것을 피할 수 있습니까?Python3 : 예외 체인 제거?

약간의 배경 정보 : 나는 urwid로 놀고 있는데, TUI library은 python이다. 사용자 인터페이스는 urwid.MainLoop.run()을 호출하여 시작하고urwid.ExitMainLoop()을 발생시켜 으로 끝납니다. 지금까지 잘 작동하지만 다른 예외가 발생하면 어떻게됩니까? 예 : KeyboardInterrupt (urlid MainLoop이 아닙니다.)을 잡을 때, 나는 정리를하고 적절한 예외를 제기하여 사용자 인터페이스를 끝내고 싶습니다. 그러나 스택 추적으로 가득 찬 화면이 나타납니다. raise B() from A() :

일부 연구는 거의 python3이 연쇄 예외를 기억하고 하나가 명시 적으로 '원인'으로 예외를 올릴 수 있었다. 제기 된 예외에 관한 데이터를 변경하거나 추가하는 몇 가지 방법을 배웠지 만이 기능을 '비활성화'할 수있는 방법이 없습니다. 난 The above exception was the direct cause of... 같은 스택 추적 및 라인의 인쇄를 피하고 그냥 하나 밖에있을 것 같아 except: 블록 내에서 인터페이스 끝 예외를 제기하고 싶습니다.

이 가능 아니면 근본적으로 뭔가 잘못하고있는 중이 야?

편집 : 여기에 같은 문제의 결과로, 내 현재의 구조를 닮은 예제 :

#!/usr/bin/env python3 
import time 

class Exit_Main_Loop(Exception): 
    pass 

# UI main loop 
def main_loop(): 
    try: 
     while True: 
      time.sleep(0.1) 
    except Exit_Main_Loop as e: 
     print('Exit_Main_Loop') 
     # do some UI-related clean up 

# my main script 
try: 
    main_loop() 
except KeyboardInterrupt as e: 
    print('KeyboardInterrupt') 
    # do some clean up 
    raise Exit_Main_Loop()  # signal the UI to terminate 

불행하게도 나뿐만 아니라 KeyboardInterrupt을 제외시켰다 위해 main_loop을 변경할 수 없습니다. 이 문제를 해결할 수있는 패턴이 있습니까?

+0

전혀 스택 추적을 원하지 않습니까? 아니면 가장 바깥 쪽 예외의 스택 추적 만 원하십니까, 아니면 가장 안쪽 예외의 스택 추적 만 원하십니까? – abarnert

+0

_any_ stack trace를 원하지 않는다면, 전체 "main"코드를'try :'/'Exception as e :'로 감싸고 원하는 예외를 처리하십시오 (예를 들어'print (repr (e)); sys.exit (1)'). – abarnert

+0

나는 (사용자를 위해) 예외가 발생했음을 나타내는 것이 없다. 스택 추적이나 다른 텍스트 출력이 없다. 내 말은, 나는 예외를 잡았고 내가해야 할 일을했다. 더 이상 스택 추적이 필요 없다. (나는 그것을 읽고 싶었을 때 직접 인쇄했다.) 마찬가지로, urwid.MainLoop도 Exit 예외를 침묵합니다. 두 개의 예외가 연속적으로 발생하기 때문에 (둘 다 제대로 캐치 된 경우) 누락 된 예외와 유사한 결과가 발생해야하는 이유가 없습니다. – Julian

답변