파이썬에서 예외 값 얻기


239

그 코드가 있다면 :

try:
    some_method()
except Exception, e:

이 예외 값 (문자열 표현)을 어떻게 얻을 수 있습니까?

답변:


323

사용하다 str

try:
    some_method()
except Exception as e:
    s = str(e)

또한 대부분의 예외 클래스에는 args속성이 있습니다. 종종 args[0]오류 메시지가 나타납니다.

str오류 메시지가 없으면을 사용 하면 빈 문자열이 반환되지만 reprpyfunc 권장 사항을 사용하면 최소한 예외 클래스가 표시됩니다. 필자는 인쇄하는 경우 클래스가 무엇인지 신경 쓰지 않고 오류 메시지 만 원하는 최종 사용자를위한 것입니다.

실제로 처리하는 예외 클래스와 인스턴스화 방법에 따라 다릅니다. 특별히 염두에 두었습니까?


보고서를 작성하기 위해 이것을 인쇄하고 있는데 str (e)은 괜찮습니다. 감사합니다
Frias

8
실제로는 메시지가 아니기 e.message때문에 사용하고 싶습니다 args[0].
cedbeu

3
repr (e)은 "global name 'variable'is not defined"대신 전체 예외 (예 : NameError ( "global name 'variable'is not defined")가 아님 ")를 얻으려는 경우에도 유용합니다.
Ben Morris

49
이 답변은 다음과 같은 유니 코드 예외에 대해 실패하므로 위험 raise Exception(u'jörn')합니다. 실제 예외는 보지 못하고 단지 a 만 표시되므로 실패는 특히 나쁩니다 UnicodeDecodeError. 예외의 인코딩을 알지 못하는 경우 (그리고 대부분의 시간을 모르는 경우) 작업해야하거나 repr(e)실제로 필요한 경우 예외 처리에서 다른 try-except 블록을 사용하여 UnicodeDecodeErrors를 포착하고 repr(e).
Jörn Hees 2016 년

11
@ JörnHees에 동의하십시오. 유니 코드 처리로 인해 버그를 발생 시킨 횟수 str(또는 짝수 unicode또는 .format)는 계산할 수 없습니다 . 오류 메시지 내용을 완전히 제어 할 수없는 경우 항상 repr예기치 않은 유니 코드 오류를 피하기 위해 사용하십시오 .
케니 Trytek

186

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

2
아, repr그것은 다른 어떤 것, 유용한 덕분에 unicode, str코딩, ... 입력에 따라 예외를 발생시킬 수 있습니다. 예외를 유지하려고 할 때 유용하지는 않지만 repr은 exception-safe그렇게 보입니다.
dashesy

2
이것은 실제로 예외 유형을 포함하기 때문에 다른 솔루션 보다 훨씬 낫습니다 str(). 로 str()내가 가진 'status'에있는 동안 repr()내가 가진 KeyError('status')내가 같았다 "으 아악, 지금은 오류를 이해".
jlh

27

이것이 오래된 질문이라는 것을 알고 있지만 예외 출력을 처리하기 위해 traceback모듈 을 사용하는 것이 좋습니다 .

traceback.print_exc()포착되지 않은 채로 인쇄되거나 traceback.format_exc()문자열과 동일한 출력을 얻는 것처럼 현재 예외를 표준 오류로 인쇄하는 데 사용하십시오 . 출력을 제한하거나 인쇄를 파일과 같은 객체로 리디렉션하려는 경우 해당 함수 중 하나에 다양한 인수를 전달할 수 있습니다.


23

다른 방법은 아직 주어지지 않았습니다 :

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.argsstr(e)(및 필요에 따라 e.message사용하는 LIB 그 메커니즘에 의존하는 경우).

예를 들어,와 pygraphviz, e.message사용, 제대로 예외를 표시 할 수있는 유일한 방법 str(e)으로 메시지를 둘러싸 u''.

그러나 MySQLdb메시지를 검색하는 올바른 방법은 e.args[1]다음 e.message과 같습니다. 는 비어 있으며 str(e)표시됩니다.'(ERR_CODE, "ERR_MSG")'


0

python2의 e.message경우 예외 메시지를 얻는 데 사용 하는 것이 UnicodeDecodeError좋습니다. 그러나 예 e.message와 같은 예외는 비어있을 것 OSError입니다.이 경우 exc_info=True오류를 놓치지 않기 위해 로깅 함수에 a 를 추가 할 수 있습니다 .
python3의 경우을 사용하는 것이 안전하다고 생각합니다 str(e).


0

오류 유형 / 원본을 모르는 경우 다음을 시도해보십시오.

import sys
try:
    doSomethingWrongHere()
except:
    print('Error: {}'.format(sys.exc_info()[0]))

그러나 pep8 경고가 나타납니다.

[W] PEP 8 (E722): do not use bare except

0

오류 메시지를 검사하고 무언가를 수행하려면 (Python 3 사용) ...

try:
    some_method()
except Exception as e:
    if {value} in e.args:
        {do something}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.