如何获取在 Python 中捕获的异常的名称?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18176602/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to get name of exception that was caught in Python?
提问by Rob Bednark
How can I get the name of an exception that was raised in Python?
如何获取在 Python 中引发的异常的名称?
e.g.,
例如,
try:
foo = bar
except Exception as exception:
name_of_exception = ???
assert name_of_exception == 'NameError'
print "Failed with exception [%s]" % name_of_exception
For example, I am catching multiple (or all) exceptions, and want to print the name of the exception in an error message.
例如,我正在捕获多个(或所有)异常,并希望在错误消息中打印异常的名称。
采纳答案by user1234
Here are a few different ways to get the name of the class of the exception:
以下是获取异常类名称的几种不同方法:
type(exception).__name__
exception.__class__.__name__
exception.__class__.__qualname__
type(exception).__name__
exception.__class__.__name__
exception.__class__.__qualname__
e.g.,
例如,
try:
foo = bar
except Exception as exception:
assert type(exception).__name__ == 'NameError'
assert exception.__class__.__name__ == 'NameError'
assert exception.__class__.__qualname__ == 'NameError'
回答by Rob Bednark
This works, but it seems like there must be an easier, more direct way?
这有效,但似乎必须有一种更简单、更直接的方法?
try:
foo = bar
except Exception as exception:
assert repr(exception) == '''NameError("name 'bar' is not defined",)'''
name = repr(exception).split('(')[0]
assert name == 'NameError'
回答by moshfiqur
You can also use sys.exc_info()
. exc_info()
returns 3 values: type, value, traceback. On documentation: https://docs.python.org/3/library/sys.html#sys.exc_info
您也可以使用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]" % name_of_exception
回答by MarredCheese
If you want the fully qualified class name(e.g. sqlalchemy.exc.IntegrityError
instead of just IntegrityError
), you can use the function below, which I took from MB's awesome answerto another question (I just renamed some variables to suit my tastes):
如果您想要完全限定的类名(例如,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__
Example:
例子:
try:
# <do something with sqlalchemy that angers the database>
except sqlalchemy.exc.SQLAlchemyError as e:
print(get_full_class_name(e))
# sqlalchemy.exc.IntegrityError
回答by MrName
The other answers here are great for exploration purposes, but if the primary goal is to log the exception (including the name of the exception), perhaps consider using logging.exceptioninstead of print?
这里的其他答案非常适合探索,但如果主要目标是记录异常(包括异常的名称),也许可以考虑使用logging.exception而不是打印?