[python] 파이썬에서 잡힌 예외의 이름을 얻는 방법?

파이썬에서 발생한 예외의 이름을 어떻게 얻을 수 있습니까?

예 :

try:
    foo = bar
except Exception as exception:
    name_of_exception = ???
    assert name_of_exception == 'NameError'
    print "Failed with exception [%s]" % name_of_exception

예를 들어, 여러 (또는 모든) 예외를 포착하고 있으며 오류 메시지에 예외 이름을 인쇄하려고합니다.



답변

예외의 클래스 이름을 가져 오는 몇 가지 방법은 다음과 같습니다.

  1. type(exception).__name__
  2. exception.__class__.__name__
  3. exception.__class__.__qualname__

예 :

try:
    foo = bar
except Exception as exception:
    assert type(exception).__name__ == 'NameError'
    assert exception.__class__.__name__ == 'NameError'
    assert exception.__class__.__qualname__ == 'NameError'


답변

이것은 작동하지만 더 쉽고 직접적인 방법이 있어야 할 것 같습니다.

try:
    foo = bar
except Exception as exception:
    assert repr(exception) == '''NameError("name 'bar' is not defined",)'''
    name = repr(exception).split('(')[0]
    assert name == 'NameError'


답변

당신은 또한 사용할 수 있습니다 sys.exc_info(). exc_info()유형, 값, 트레이스 백의 3 가지 값을 반환합니다. 문서 : https://docs.python.org/3/library/sys.html#sys.exc_info

import sys

try:
    foo = bar
except Exception:
    exc_type, value, traceback = sys.exc_info()
    assert exc_type.__name__ == 'NameError'
    print "Failed with exception [%s]" % exc_type.__name__


답변

당신이 원하는 경우 정규화 된 클래스 이름을 (예를 들어, sqlalchemy.exc.IntegrityError대신의 IntegrityError), 당신은 내가 빼앗아 아래의 기능을 사용할 수 있습니다 MB의 멋진 대답 (난 그냥 내 취향에 맞게 몇 가지 변수를 이름) 또 다른 질문을 :

def get_full_class_name(obj):
    module = obj.__class__.__module__
    if module is None or module == str.__class__.__module__:
        return obj.__class__.__name__
    return module + '.' + obj.__class__.__name__

예:

try:
    # <do something with sqlalchemy that angers the database>
except sqlalchemy.exc.SQLAlchemyError as e:
    print(get_full_class_name(e))

# sqlalchemy.exc.IntegrityError


답변

여기에있는 다른 답변은 탐색 목적으로 유용하지만 기본 목표가 예외 (예외 이름 포함)를 기록하는 것이라면 인쇄 대신 logging.exception을 사용하는 것이 좋습니다.


답변