我如何在Python中获取引发异常的名称?
例如:
try:
foo = bar
except Exception as exception:
name_of_exception = ???
assert name_of_exception == 'NameError'
print "Failed with exception [%s]" % name_of_exception
例如,我正在捕获多个(或全部)异常,并希望在错误消息中打印异常的名称。以下是几种获取异常类名的方法:
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
。 - Ricky Levitraceback(most recent call last) : ...
? - user13786942sqlalchemy.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
try:
#Code to execute
except Exception as err:
print(f"{type(err).__name__} was raised: {err}")
你也可以使用 sys.exc_info()
。 exc_info()
返回三个值:类型、值和回溯信息。 文档链接: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__
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
。 - Maciej Goltry:
do_something()
except BaseException as e:
logger.error(f'whoops! {type(e)}: {e}')
# or maybe
print(f'whoops! {type(e)}: {e}', file=sys.stderr)
logger.error(...)替换为logger.exception('whoops!')(NB用户消息是必需的param),则您将记录您的异常的完全限定名称,更不用说它的消息和免费的堆栈跟踪了。
PS 正如名称所示,JSONDecodeError在我的例子中是一个Error,而不是一个Exception(它是ValueError的一个子类)。 捕获BaseException(Error和Exception的超类)通常使得当您没有钓鱼特定异常时生活更轻松。 OP说他想捕获“所有”异常。
except NameError:
)呢? - user395760traceback
模块,它具有一些很好的异常和回溯格式化函数。 - Blckknght