답변:
사용하다 str
try:
some_method()
except Exception as e:
s = str(e)
또한 대부분의 예외 클래스에는 args속성이 있습니다. 종종 args[0]오류 메시지가 나타납니다.
str오류 메시지가 없으면을 사용 하면 빈 문자열이 반환되지만 reprpyfunc 권장 사항을 사용하면 최소한 예외 클래스가 표시됩니다. 필자는 인쇄하는 경우 클래스가 무엇인지 신경 쓰지 않고 오류 메시지 만 원하는 최종 사용자를위한 것입니다.
실제로 처리하는 예외 클래스와 인스턴스화 방법에 따라 다릅니다. 특별히 염두에 두었습니까?
e.message때문에 사용하고 싶습니다 args[0].
raise Exception(u'jörn')합니다. 실제 예외는 보지 못하고 단지 a 만 표시되므로 실패는 특히 나쁩니다 UnicodeDecodeError. 예외의 인코딩을 알지 못하는 경우 (그리고 대부분의 시간을 모르는 경우) 작업해야하거나 repr(e)실제로 필요한 경우 예외 처리에서 다른 try-except 블록을 사용하여 UnicodeDecodeErrors를 포착하고 repr(e).
str(또는 짝수 unicode또는 .format)는 계산할 수 없습니다 . 오류 메시지 내용을 완전히 제어 할 수없는 경우 항상 repr예기치 않은 유니 코드 오류를 피하기 위해 사용하십시오 .
repr () 사용과 repr과 str 사용의 차이점
사용 repr:
>>> try:
... print(x)
... except Exception as e:
... print(repr(e))
...
NameError("name 'x' is not defined")
사용 str:
>>> try:
... print(x)
... except Exception as e:
... print(str(e))
...
name 'x' is not defined
repr그것은 다른 어떤 것, 유용한 덕분에 unicode, str코딩, ... 입력에 따라 예외를 발생시킬 수 있습니다. 예외를 유지하려고 할 때 유용하지는 않지만 repr은 exception-safe그렇게 보입니다.
str(). 로 str()내가 가진 'status'에있는 동안 repr()내가 가진 KeyError('status')내가 같았다 "으 아악, 지금은 오류를 이해".
이것이 오래된 질문이라는 것을 알고 있지만 예외 출력을 처리하기 위해 traceback모듈 을 사용하는 것이 좋습니다 .
traceback.print_exc()포착되지 않은 채로 인쇄되거나 traceback.format_exc()문자열과 동일한 출력을 얻는 것처럼 현재 예외를 표준 오류로 인쇄하는 데 사용하십시오 . 출력을 제한하거나 인쇄를 파일과 같은 객체로 리디렉션하려는 경우 해당 함수 중 하나에 다양한 인수를 전달할 수 있습니다.
다른 방법은 아직 주어지지 않았습니다 :
try:
1/0
except Exception, e:
print e.message
산출:
integer division or modulo by zero
args[0] 실제로 메시지가 아닐 수도 있습니다.
str(e)따옴표로 묶고 따옴표가 붙은 문자열을 반환 할 수 있습니다 u.
'integer division or modulo by zero'
repr(e) 아마도 당신이 원하지 않는 완전한 예외 표현을 제공합니다 :
"ZeroDivisionError('integer division or modulo by zero',)"
편집하다
내 잘못이야 !!! BaseException.message 에서 더 이상 사용되지 않는2.6 것 같습니다 . 마지막으로 예외 메시지를 표시하는 표준화 된 방법이 아직없는 것 같습니다. 내가 추측 있도록 최선와 거래를하는 것입니다 e.args및 str(e)(및 필요에 따라 e.message사용하는 LIB 그 메커니즘에 의존하는 경우).
예를 들어,와 pygraphviz, e.message사용, 제대로 예외를 표시 할 수있는 유일한 방법 str(e)으로 메시지를 둘러싸 u''.
그러나 MySQLdb메시지를 검색하는 올바른 방법은 e.args[1]다음 e.message과 같습니다. 는 비어 있으며 str(e)표시됩니다.'(ERR_CODE, "ERR_MSG")'