【问题标题】:How to get the name of an exception that was caught in Python?如何获取在 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语句处理,但日志条目非常相似在每种情况下。

标签: python exception


【解决方案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】:

这里有几种不同的方法来获取异常类的名称:

  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'

【讨论】:

  • 当你提出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}")
      

      【讨论】:

      • 帮助很大。
      猜你喜欢
      • 2021-08-19
      • 2023-03-24
      • 2018-07-03
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2016-12-13
      • 2017-05-08
      • 1970-01-01
      相关资源
      最近更新 更多