파이썬 라이브러리에서 내 자신의 예외를 발생 시키면 예외 스택에 레이즈 라인 자체가 스택의 마지막 항목으로 표시됩니다. 이것은 분명히 오류가 아니며 개념 상으로 옳습니다. 그러나 코드를 모듈처럼 외부에서 사용할 때 디버깅에 유용하지 않은 것에 중점을 둡니다.예외 스택에 파이썬 레이즈 라인 표시 안 함
이 문제를 피하고 파이썬이 표준 파이썬 라이브러리처럼 마지막 스택 항목을 마지막으로 표시하도록하는 방법이 있습니까?
파이썬 라이브러리에서 내 자신의 예외를 발생 시키면 예외 스택에 레이즈 라인 자체가 스택의 마지막 항목으로 표시됩니다. 이것은 분명히 오류가 아니며 개념 상으로 옳습니다. 그러나 코드를 모듈처럼 외부에서 사용할 때 디버깅에 유용하지 않은 것에 중점을 둡니다.예외 스택에 파이썬 레이즈 라인 표시 안 함
이 문제를 피하고 파이썬이 표준 파이썬 라이브러리처럼 마지막 스택 항목을 마지막으로 표시하도록하는 방법이 있습니까?
주의 경고 : 통역사의 행동을 수정하는 것은 일반적으로 싫은 일입니다. 그리고 어쨌든 오류가 발생한 정확한 위치를 확인하는 것이 디버깅에 도움이 될 수 있습니다. 특히 여러 가지 이유로 함수에서 오류가 발생할 수있는 경우에 특히 유용합니다.
traceback
모듈을 사용하고 sys.excepthook
을 맞춤 함수로 바꾼다면 가능할 수 있습니다. 그러나 변경 작업은 모듈뿐만 아니라 전체 프로그램의 오류 표시에도 영향을 미치므로 권장하지 않는 것이 좋습니다.
try/except 블록에 코드를 넣은 다음 오류를 수정하고 다시 올리면됩니다. 그러나 예기치 않은 오류가 발생하지 않도록 시간을 보내는 것이 좋습니다. 발생할 수있는 오류 메시지를 작성하는 것이 좋습니다.
나는 예외 메커니즘을 사용하여 인수의 유효성을 검사하지 않는 것이 좋습니다. 조건부로 예외를 코딩하는 것은 "개발자로서 제 제안 된 인수가 초래할 수있는 모든 나쁜 조건을 생각하지 않으면 내 응용 프로그램을 중단합니다. 아마도 제어를 벗어나는 것 외에도 예외를 사용하는 것일 수도 있습니다. 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()
아마도 대단한 대답은 아닐 것입니다.
나는 가능한 한 많은 예외를 피하고 그것을 처리하고, 조치를 취하고, 문제를 기록하고, 계속 걷는 내 프로그램을 말하면서 나는 이것을 upvote해야만했다. 나는 다른 모든 사람들처럼 예외를 던지는 것보다 더 많은 디버깅 성공을 거두었 다. 기본적으로 나는 raise 대신 print()를 사용하고있다. – Tcll
나는 이것에 대해서도 생각해 봤다. 대부분의 경우 이것에 downvote 것입니다 (여전히 내 마지막 코멘트가 그대로 서있을 것입니다), 가장 좋은 개발자는 단지 잘못된 모든 유스 케이스에 대해 아무런 대가없이 예외를 던지지 않고 예외를받을 자격이있는 특정 사례 만 인상을받습니다. ... 당신의 코드조차 잡히지 않는 특별한 경우에도 여전히 위와 같은 일이 일어날 수 있습니다. 예 : filename은 str을 나타내는 객체입니다. – Tcll
당신은 파이썬에서 독자적인 예외 훅을 만들 수 있습니다. 아래 코드는 내가 사용하고있는 코드의 예입니다.
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에서 사용하고 있습니다.
위의 내용은 내 자신의 모듈에서 특정 용도로 사용되었습니다. 모듈을 수정하고 사용할 수 있습니다.
레이즈 라인은 컴파일 된 C 코드에서 발생시킬 때 숨겨집니다 (표시 할 레이즈 라인이 없기 때문에). 표준 라이브러리의 파이썬 부분은 여전히 traceback에 raise 문을 표시합니다. –
아마도'sys.excepthook'을 해킹하여'raise' 일 경우 마지막 줄을 제외시킬 수 있습니다. 그러나 일반적으로 불가능합니다. 익숙해 져야합니다. – delnan
항상 유용한 예외를 발생시킬 수 있습니다. –