【问题标题】:Getting the exception value in Python在 Python 中获取异常值
【发布时间】:2026-01-06 01:20:03
【问题描述】:

如果我有那个代码:

try:
    some_method()
except Exception, e:

我怎样才能得到这个异常值(字符串 我的意思是代表)?

【问题讨论】:

    标签: python exception


    【解决方案1】:

    使用str

    try:
        some_method()
    except Exception as e:
        s = str(e)
    

    此外,大多数异常类都有args 属性。通常,args[0] 将是一条错误消息。

    需要注意的是,如果没有错误消息,仅使用str 将返回一个空字符串,而按照pyfunc 的建议使用repr 至少会显示异常的类。我的看法是,如果您将其打印出来,它是为一个不关心类是什么而只想要一条错误消息的最终用户提供的。

    这实际上取决于您正在处理的异常类别以及它是如何实例化的。你有什么特别的想法吗?

    【讨论】:

    • 我打印这个是为了做报告,我猜 str(e) 没问题。非常感谢
    • 我更喜欢使用e.message,因为args[0]实际上可能不是一条消息。
    • repr(e) 如果你想获得完整的异常也很有帮助(例如 NameError("global name 'variable' is not defined",),而不是 "global name 'variable' is not定义”
    • 这个答案很危险,因为它会因为这样的 unicode 异常而失败:raise Exception(u'jörn')。失败尤其糟糕,因为您永远不会看到实际的异常,而只会看到UnicodeDecodeError。如果您不知道异常的编码(并且大多数情况下您不知道),您应该使用repr(e),或者如果您确实需要,请在您的异常处理中使用另一个 try-except 块来捕获 UnicodeDecodeErrors 和回退到repr(e)
    • 同意@JörnHees。我无法计算str(甚至unicode.format)由于Unicode 处理而导致错误的次数。如果您无法完全控制错误消息的内容,请始终使用repr 以避免意外的 Unicode 错误。
    【解决方案2】:

    使用repr()和使用repr和str的区别

    使用repr:

    >>> try:
    ...     print(x)
    ... except Exception as e:
    ...     print(repr(e))
    ... 
    NameError("name 'x' is not defined")
    

    使用str

    >>> try:
    ...     print(x)
    ... except Exception as e:
    ...     print(str(e))
    ... 
    name 'x' is not defined
    

    【讨论】:

    • 啊,repr 很有用,谢谢,似乎其他任何东西unicodestr,编码,...可能会根据输入引发异常。尝试保持异常查看时不太有用,但 repr 似乎是exception-safe
    • 这比任何str()-like 解决方案都好多,因为它实际上包含了异常的类型。使用str() 我得到'status' 而使用repr() 我得到KeyError('status') 我就像“啊啊啊,现在我明白错误了”。
    【解决方案3】:

    即使我意识到这是一个老问题,我还是建议使用traceback module 来处理异常的输出。

    使用traceback.print_exc() 将当前异常打印为标准错误,就像它仍然未被捕获时打印一样,或者使用traceback.format_exc() 获得与字符串相同的输出。如果您想限制输出或将打印重定向到类似文件的对象,您可以将各种参数传递给这些函数中的任何一个。

    【讨论】:

    • 当我想显示后台发生的事情时,通常我更喜欢 str() 或 repr() 用于警告或信息条目 sys.stdout.write() 。但是,当需要显示完整的错误跟踪而不让您的程序结束时,回溯可能会很有用。
    【解决方案4】:

    另一种方法还没给出:

    try:
        1/0
    except Exception, e:
        print e.message
    

    输出:

    integer division or modulo by zero
    

    args[0]实际上可能不是一条消息。

    str(e) 可能会返回带有引号的字符串,如果是 unicode,则可能带有前导 u

    'integer division or modulo by zero'
    

    repr(e) 给出了完整的异常表示,这可能不是您想要的:

    "ZeroDivisionError('integer division or modulo by zero',)"
    

    编辑

    我的错!看来BaseException.messagehas been deprecated from 2.6,最后,肯定还是没有一个标准化的方式来显示异常信息。所以我想最好的办法是根据您的需要处理e.argsstr(e)(如果您使用的库依赖于该机制,则可能是e.message)。

    例如,使用pygraphvize.message 是正确显示异常的唯一方法,使用str(e) 将用u'' 包围消息。

    但是使用MySQLdb,获取消息的正确方法是e.args[1]e.message 为空,str(e) 将显示'(ERR_CODE, "ERR_MSG")'

    【讨论】:

      【解决方案5】:

      检查错误消息并对其进行处理(使用 Python 3)...

      try:
          some_method()
      except Exception as e:
          if {value} in e.args:
              {do something}
      

      【讨论】:

        【解决方案6】:

        对于python2,最好使用e.message来获取异常信息,这样可以避免UnicodeDecodeError的可能。但是,是的,e.message 对于某些类型的异常(例如 OSError)将为空,在这种情况下,我们可以将 exc_info=True 添加到我们的日志记录函数中,以免错过错误。
        对于python3,我认为使用str(e)是安全的。

        【讨论】:

          【解决方案7】:

          如果您不知道错误的类型/来源,可以尝试:

          import sys
          try:
              doSomethingWrongHere()
          except:
              print('Error: {}'.format(sys.exc_info()[0]))
          

          但请注意,您会收到 pep8 警告:

          [W] PEP 8 (E722): do not use bare except
          

          【讨论】: