问题:如何获取在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
例如,我捕获了多个(或所有)异常,并想在错误消息中打印异常的名称。
回答 0
以下是获取异常类名称的几种不同方法:
type(exception).__name__
exception.__class__.__name__
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'
回答 1
这行得通,但似乎必须有一种更简单,更直接的方法?
try:
foo = bar
except Exception as exception:
assert repr(exception) == '''NameError("name 'bar' is not defined",)'''
name = repr(exception).split('(')[0]
assert name == 'NameError'
回答 2
您也可以使用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__
回答 3
如果您想要完全限定的类名(例如,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
回答 4
此处的其他答案非常适合用于探索目的,但是如果主要目标是记录异常(包括异常的名称),则可以考虑使用logging.exception而不是print?
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。