如何获取在 Python 中捕获的异常的名称?
Posted
技术标签:
【中文标题】如何获取在 Python 中捕获的异常的名称?【英文标题】:How to get the name of an exception that was caught in Python? 【发布时间】:2013-08-13 03:37:58 【问题描述】:如何获取 Python 中引发的异常的名称?
例如,
try:
foo = bar
except Exception as exception:
name_of_exception = ???
assert name_of_exception == 'NameError'
print "Failed with exception [%s]" % name_of_exception
例如,我正在捕获多个(或所有)异常,并希望在错误消息中打印异常的名称。
【问题讨论】:
为什么你认为你需要这个?为什么不从更具体的异常(例如except NameError:
)开始?
我有几个场景想要捕获所有异常(或它们的列表),并希望在错误消息中打印出异常的名称。
您可能想查看标准库的 traceback
模块,该模块的函数可以很好地格式化异常和回溯。
@delnan 当你测试一个函数是否按照程序引发异常时会出现这种情况
我需要这样的东西来干掉一些代码:我调用的方法可以引发几个异常,每个异常都用自己的except
语句处理,但日志条目非常相似在每种情况下。
【参考方案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'
【讨论】:
将except Exception as exception
替换为您想要捕获的异常类型,即except NameError as exception
。
我不想捕获预先知道的特定异常。我想捕获所有个异常。【参考方案2】:
这里有几种不同的方法来获取异常类的名称:
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'
【讨论】:
当你提出raise socket.timeout
时,你只会得到名字:timeout
有没有办法获得traceback(most recent call last) : ...
?【参考方案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__
【讨论】:
【参考方案4】:如果你想要完全限定的类名(例如sqlalchemy.exc.IntegrityError
而不仅仅是IntegrityError
),你可以使用下面的函数,我从MB's awesome answer 到另一个问题(我只是重命名了一些变量以适合我的口味):
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
【讨论】:
【参考方案5】:这里的其他答案非常适合探索,但如果主要目标是记录异常(包括异常的名称),也许考虑使用logging.exception 而不是打印?
【讨论】:
你在回答问题吗?【参考方案6】:您可以使用一些格式化的字符串打印异常:
例子:
try:
#Code to execute
except Exception as err:
print(f"type(err).__name__ was raised: err")
【讨论】:
帮助很大。以上是关于如何获取在 Python 中捕获的异常的名称?的主要内容,如果未能解决你的问题,请参考以下文章
如何捕获“应用程序名称[procId]中发生未处理的win32异常。”
如何在 Django rest 框架中捕获 Model.DoesNotExist 异常?