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

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

例如,

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

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

121686 次浏览

这是可行的,但似乎一定有更简单、更直接的方法?

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

下面是几种获取异常类名的不同方法:

  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'

你也可以使用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而不是print?

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

例子:

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