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


122

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

예 :

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

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


3
이것이 필요하다고 생각합니까? except NameError:시작하기 위해 더 구체적인 예외 (예 :)를 포착하지 않는 이유는 무엇 입니까?

7
모든 예외 (또는 그 목록)를 포착하고 오류 메시지에 예외 이름을 인쇄하려는 몇 가지 시나리오가 있습니다.
롭 Bednark

1
traceback예외와 역 추적을 멋지게 형식화하는 함수가 있는 표준 라이브러리의 모듈 을 확인하고 싶을 수도 있습니다 .
Blckknght

1
@delnan이 상황은 함수가 프로그래밍 된대로 예외를 발생시키는 지 테스트 할 때 발생합니다.
gokul_uf

일부 코드를 건조시키기 위해 다음과 같은 것이 필요했습니다. 제가 호출하는 메서드에 의해 여러 가지 예외가 발생할 수 있으며, 각 예외는 자체 except문으로 처리 되지만 로그 항목은 각 경우에 매우 유사합니다.
Adam Carroll

답변:


224

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

  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'

6

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

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

4
대체 except Exception as exception당신은, 예를 잡을 싶습니다 예외의 유형 except NameError as exception.
Maciej Gol

8
사전에 알려진 특정 예외를 포착하고 싶지 않습니다. 모든 예외 를 포착하고 싶습니다 .
Rob Bednark

3

당신은 또한 사용할 수 있습니다 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__

1

당신이 원하는 경우 정규화 된 클래스 이름을 (예를 들어, 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

0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.