some_function()
执行时抛出异常,所以程序跳转到except
:
try:
some_function()
except:
print("exception happened!")
如何查看导致异常发生的原因?
最佳答案
其他答案都指出您不应该捕获通用异常,但似乎没有人想告诉您原因,这对于了解何时可以打破“规则”至关重要。 Here是一种解释。基本上,这样你就不会隐藏:
- 发生错误的事实
- 所发生错误的细节 (error hiding antipattern)
因此,只要您注意不做这些事情,就可以捕获通用异常。例如,您可以通过其他方式向用户提供有关异常的信息,例如:
- 在 GUI 中将异常显示为对话框
- 将异常从工作线程或进程转移到多线程或多处理应用程序中的控制线程或进程
那么如何捕获泛型异常呢?有几种方法。如果您只想要异常对象,请这样做:
try:
someFunction()
except Exception as ex:
template = "An exception of type {0} occurred. Arguments:\n{1!r}"
message = template.format(type(ex).__name__, ex.args)
print message
确保确保 message
以一种不容错过的方式引起用户的注意!如果消息隐藏在许多其他消息中,打印它,如上所示,可能还不够。未能引起用户的注意无异于吞下所有的异常(exception),如果您在阅读此页面上的答案后应该有一个印象,那就是这不是一件好事。用 raise
语句结束 except block 将通过透明地重新引发捕获的异常来解决问题。
上面和只使用 except:
没有任何参数的区别是双重的:
- 一个简单的
except:
不会为您提供要检查的异常对象 SystemExit
、KeyboardInterrupt
和GeneratorExit
的异常没有被上面的代码捕获,这通常是你想要的。见 exception hierarchy .
如果您还想要在未捕获异常的情况下获得相同的堆栈跟踪,则可以这样获得(仍在 except 子句中):
import traceback
print traceback.format_exc()
如果您使用 logging
模块,您可以像这样将异常打印到日志(连同一条消息):
import logging
log = logging.getLogger()
log.exception("Message for you, sir!")
如果您想深入挖掘并检查堆栈、查看变量等,请使用 post_mortem
pdb
模块在 except block 中的功能:
import pdb
pdb.post_mortem()
我发现最后一种方法在寻找错误时非常有用。
关于python - 如何确定发生了什么类型的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9823936/