如何获取Python中捕获的异常名称?

Rob*_*ark 108 python exception-handling exception

如何获取Python中引发的异常的名称?

例如,

try:
    foo = bar
except Exception as exception:
    name_of_exception = ???
    assert name_of_exception == 'NameError'
    print "Failed with exception [%s]" % name_of_exception
Run Code Online (Sandbox Code Playgroud)

例如,我正在捕获多个(或所有)异常,并希望在错误消息中打印异常的名称.

use*_*234 188

以下是获取异常名称的两种不同方法:

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

例如,

try:
    foo = bar
except Exception as exception:
    assert type(exception).__name__ == 'NameError'
    assert exception.__class__.__name__ == 'NameError'
Run Code Online (Sandbox Code Playgroud)

  • 当你提出“raise socket.timeout”时,你只会得到名称:“timeout” (3认同)

小智 15

您可以使用一些格式化字符串打印异常:

例子:

try:
    #Code to execute
except Exception as err:
    print(f"{type(err).__name__} was raised: {err}")
Run Code Online (Sandbox Code Playgroud)


mos*_*qur 7

您也可以使用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__
Run Code Online (Sandbox Code Playgroud)


Rob*_*ark 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'
Run Code Online (Sandbox Code Playgroud)

  • 我不想捕捉预先知道的特定异常。我想捕获*所有*异常。 (16认同)
  • 将“except Exception as exception”替换为您想要捕获的异常类型,即“except NameError as exception”。 (4认同)

Mar*_*ese 5

如果您想要完全限定的类名(例如,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__
Run Code Online (Sandbox Code Playgroud)

例子:

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

# sqlalchemy.exc.IntegrityError
Run Code Online (Sandbox Code Playgroud)