[python] 파이썬에서 예외 값 얻기

그 코드가 있다면 :

try:
    some_method()
except Exception, e:

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



답변

사용하다 str

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

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

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

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


답변

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


답변

이것이 오래된 질문이라는 것을 알고 있지만 예외 출력을 처리하기 위해 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.argsstr(e)(및 필요에 따라 e.message사용하는 LIB 그 메커니즘에 의존하는 경우).

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

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


답변

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


답변

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

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

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

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


답변

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

try:
    some_method()
except Exception as e:
    if {value} in e.args:
        {do something}