2010-12-12 2 views
19

파이썬 라이브러리에서 내 자신의 예외를 발생 시키면 예외 스택에 레이즈 라인 자체가 스택의 마지막 항목으로 표시됩니다. 이것은 분명히 오류가 아니며 개념 상으로 옳습니다. 그러나 코드를 모듈처럼 외부에서 사용할 때 디버깅에 유용하지 않은 것에 중점을 둡니다.예외 스택에 파이썬 레이즈 라인 표시 안 함

이 문제를 피하고 파이썬이 표준 파이썬 라이브러리처럼 마지막 스택 항목을 마지막으로 표시하도록하는 방법이 있습니까?

+7

레이즈 라인은 컴파일 된 C 코드에서 발생시킬 때 숨겨집니다 (표시 할 레이즈 라인이 없기 때문에). 표준 라이브러리의 파이썬 부분은 여전히 ​​traceback에 raise 문을 표시합니다. –

+0

아마도'sys.excepthook'을 해킹하여'raise' 일 경우 마지막 줄을 제외시킬 수 있습니다. 그러나 일반적으로 불가능합니다. 익숙해 져야합니다. – delnan

+4

항상 유용한 예외를 발생시킬 수 있습니다. –

답변

7

주의 경고 : 통역사의 행동을 수정하는 것은 일반적으로 싫은 일입니다. 그리고 어쨌든 오류가 발생한 정확한 위치를 확인하는 것이 디버깅에 도움이 될 수 있습니다. 특히 여러 가지 이유로 함수에서 오류가 발생할 수있는 경우에 특히 유용합니다.

traceback 모듈을 사용하고 sys.excepthook을 맞춤 함수로 바꾼다면 가능할 수 있습니다. 그러나 변경 작업은 모듈뿐만 아니라 전체 프로그램의 오류 표시에도 영향을 미치므로 권장하지 않는 것이 좋습니다.

try/except 블록에 코드를 넣은 다음 오류를 수정하고 다시 올리면됩니다. 그러나 예기치 않은 오류가 발생하지 않도록 시간을 보내는 것이 좋습니다. 발생할 수있는 오류 메시지를 작성하는 것이 좋습니다.

-1

나는 예외 메커니즘을 사용하여 인수의 유효성을 검사하지 않는 것이 좋습니다. 조건부로 예외를 코딩하는 것은 "개발자로서 제 제안 된 인수가 초래할 수있는 모든 나쁜 조건을 생각하지 않으면 내 응용 프로그램을 중단합니다. 아마도 제어를 벗어나는 것 외에도 예외를 사용하는 것일 수도 있습니다. OS 나 하드웨어 나 Python 언어 같은 것을 통제하는 것이 더 논리적 일 것입니다. 그러나 실제로는 솔루션을 요청할 때 예외를 사용합니다.

질문에 대답하려면, thusly 히 코딩하는만큼 간단하다 :

class MyObject(object): 
    def saveas(self, filename): 
     if not validate_filename(filename): 
      return False 
     ... 

발신자에게

if not myobject.saveas(filename): report_and_retry() 

아마도 대단한 대답은 아닐 것입니다.

+0

나는 가능한 한 많은 예외를 피하고 그것을 처리하고, 조치를 취하고, 문제를 기록하고, 계속 걷는 내 프로그램을 말하면서 나는 이것을 upvote해야만했다. 나는 다른 모든 사람들처럼 예외를 던지는 것보다 더 많은 디버깅 성공을 거두었 다. 기본적으로 나는 raise 대신 print()를 사용하고있다. – Tcll

+0

나는 이것에 대해서도 생각해 봤다. 대부분의 경우 이것에 downvote 것입니다 (여전히 내 마지막 코멘트가 그대로 서있을 것입니다), 가장 좋은 개발자는 단지 잘못된 모든 유스 케이스에 대해 아무런 대가없이 예외를 던지지 않고 예외를받을 자격이있는 특정 사례 만 인상을받습니다. ... 당신의 코드조차 잡히지 않는 특별한 경우에도 여전히 위와 같은 일이 일어날 수 있습니다. 예 : filename은 str을 나타내는 객체입니다. – Tcll

4

당신은 파이썬에서 독자적인 예외 훅을 만들 수 있습니다. 아래 코드는 내가 사용하고있는 코드의 예입니다.

import sys 
import traceback 

def exceptionHandler(got_exception_type, got_exception, got_traceback): 
    listing = traceback.format_exception(got_exception_type, got_exception, got_traceback) 
    # Removing the listing of statement raise (raise line). 
    del listing[-2] 
    filelist = ["org.python.pydev"] # avoiding the debuger modules. 
    listing = [ item for item in listing if len([f for f in filelist if f in item]) == 0 ] 
    files = [line for line in listing if line.startswith(" File")] 
    if len(files) == 1: 
     # only one file, remove the header. 
     del listing[0] 
    print>>sys.stderr, "".join(listing) 

다음은 사용자 정의 예외 코드에 사용 된 몇 줄입니다. 당신이 원하지 않는 파일을 무시하려는 경우 목록에서 "파일 이름을"파일 이름 또는 모듈 이름을 추가 할 수있는 방법이 예외에

sys.excepthook = exceptionHandler 
raise Exception("My Custom error message.") 

. Python pydev 모듈을 무시 했으므로 pydev 디버거를 Eclipse에서 사용하고 있습니다.

위의 내용은 내 자신의 모듈에서 특정 용도로 사용되었습니다. 모듈을 수정하고 사용할 수 있습니다.