답변:
사용하다 str
try:
some_method()
except Exception as e:
s = str(e)
또한 대부분의 예외 클래스에는 args
속성이 있습니다. 종종 args[0]
오류 메시지가 나타납니다.
str
오류 메시지가 없으면을 사용 하면 빈 문자열이 반환되지만 repr
pyfunc 권장 사항을 사용하면 최소한 예외 클래스가 표시됩니다. 필자는 인쇄하는 경우 클래스가 무엇인지 신경 쓰지 않고 오류 메시지 만 원하는 최종 사용자를위한 것입니다.
실제로 처리하는 예외 클래스와 인스턴스화 방법에 따라 다릅니다. 특별히 염두에 두었습니까?
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")'