Fro*_*art 66 python exception-handling exception
从Python中的标准库组件中获取异常消息的最佳方法是什么?
我注意到在某些情况下你可以通过message
字段得到它:
try:
pass
except Exception as ex:
print(ex.message)
Run Code Online (Sandbox Code Playgroud)
但在某些情况下(例如,在套接字错误的情况下)你必须做这样的事情:
try:
pass
except socket.error as ex:
print(ex)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有任何标准方法可以涵盖大部分情况?
Art*_*are 59
如果您查看内置错误的文档,您会看到大多数Exception
类将其第一个参数指定为message
属性.但并非所有人都这样做.
值得注意的是,EnvironmentError
(带子类IOError
和OSError
)的第一个参数是errno
,第二个strerror
.没有message
... strerror
大致类似于通常的情况message
.
更一般地说,子类Exception
可以做任何他们想做的事情.它们可能有也可能没有message
属性.未来的内置Exception
s可能没有message
属性.Exception
从第三方库或用户代码导入的任何子类可能没有message
属性.
我认为处理这个问题的正确方法是确定Exception
你想要捕获的特定子类,然后只使用a捕获那些而不是所有的except Exception
子类,然后利用特定子类定义的任何属性.
如果你必须print
做某事,我认为打印被抓住Exception
本身最有可能做你想要的,无论它是否有message
属性.
你也可以检查一下你想要的消息属性,就像这样,但我不会真的建议它,因为它看起来很麻烦:
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)
Run Code Online (Sandbox Code Playgroud)
ace*_*was 19
为了改进@artofwarfare提供的答案,我认为这是一种更简洁的方法来检查message
属性并打印它或打印Exception
对象作为后备.
try:
pass
except Exception as e:
print getattr(e, 'message', repr(e))
Run Code Online (Sandbox Code Playgroud)
调用repr
是可选的,但我发现在某些用例中它是必要的.
更新#1:
根据@MadPhysicist的评论,这里有一个证明为什么repr
可能需要调用.尝试在解释器中运行以下代码:
try:
raise Exception
except Exception as e:
print(getattr(e, 'message', repr(e)))
print(getattr(e, 'message', str(e)))
Run Code Online (Sandbox Code Playgroud)
更新#2:
这是一个包含Python 2.7和3.5细节的演示:https://gist.github.com/takwas/3b7a6edddef783f2abddffda1439f533
小智 7
我也有同样的问题。深入研究,我发现 Exception 类有一个args
属性,它捕获用于创建异常的参数。如果您将 except 将捕获的异常缩小到一个子集,您应该能够确定它们的构造方式,从而确定哪个参数包含消息。
try:
# do something that may raise an AuthException
except AuthException as ex:
if ex.args[0] == "Authentication Timeout.":
# handle timeout
else:
# generic handling
Run Code Online (Sandbox Code Playgroud)
小智 7
from traceback import format_exc
try:
fault = 10/0
except ZeroDivision:
print(format_exc())
Run Code Online (Sandbox Code Playgroud)
另一种可能性是使用回溯模块中的 format_exc() 方法。
归档时间: |
|
查看次数: |
77498 次 |
最近记录: |