首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Python中正确获取异常消息

如何在Python中正确获取异常消息
EN

Stack Overflow用户
提问于 2015-10-20 22:23:46
回答 4查看 175K关注 0票数 140

从Python标准库的组件中获取异常消息的最佳方式是什么?

我注意到,在某些情况下,您可以通过message字段获取它,如下所示:

代码语言:javascript
复制
try:
  pass
except Exception as ex:
  print(ex.message)

但在某些情况下(例如,在套接字错误的情况下),您必须这样做:

代码语言:javascript
复制
try:
  pass
except socket.error as ex:
  print(ex)

我想知道有没有什么标准的方法来覆盖大多数这些情况?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-10-20 22:53:57

如果查看documentation for the built-in errors,您将看到大多数Exception类将其第一个参数指定为message属性。然而,并不是所有人都这样做。

值得注意的是,EnvironmentError (具有子类IOErrorOSError)的第一个参数为errno,第二个参数为strerror。没有message……strerror大致类似于通常的message

更广泛地说,Exception的子类可以做他们想做的任何事情。它们可能有也可能没有message属性。未来的内置Exception%s可能没有message属性。从第三方库或用户代码导入的任何Exception子类都不能具有message属性。

我认为处理这个问题的正确方法是确定您想要捕获的特定Exception子类,然后只捕获这些子类,而不是使用except Exception捕获所有子类,然后以您希望的方式利用特定子类定义的任何属性。

如果您必须print一些东西,我认为打印捕获的Exception本身最有可能做您想做的事情,无论它是否具有message属性。

如果您愿意,也可以检查message属性,如下所示,但我不建议这样做,因为它看起来很混乱:

代码语言:javascript
复制
try:
    pass
except Exception as e:
    # Just print(e) is cleaner and more likely what you want,
    # but if you insist on printing message specifically whenever possible...
    if hasattr(e, 'message'):
        print(e.message)
    else:
        print(e)
票数 131
EN

Stack Overflow用户

发布于 2020-10-20 22:46:24

我也有同样的问题。深入研究这一点,我发现exception类有一个args属性,该属性捕获用于创建异常的参数。如果您将except捕获的异常缩小到一个子集,您应该能够确定它们是如何构造的,从而确定包含该消息的参数。

代码语言:javascript
复制
try:
   # do something that may raise an AuthException
except AuthException as ex:
   if ex.args[0] == "Authentication Timeout.":
      # handle timeout
   else:
      # generic handling
票数 7
EN

Stack Overflow用户

发布于 2021-02-23 17:04:58

代码语言:javascript
复制
from traceback import format_exc


try:
    fault = 10/0
except ZeroDivision:
    print(format_exc())

另一种可能是使用回溯模块中的format_exc()方法。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33239308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档