python - 如何确定发生了什么类型的异常?

标签 python exception

some_function() 执行时抛出异常,所以程序跳转到except:

try:
    some_function()
except:
    print("exception happened!")

如何查看导致异常发生的原因?

最佳答案

其他答案都指出您不应该捕获通用异常,但似乎没有人想告诉您原因,这对于了解何时可以打破“规则”至关重要。 Here是一种解释。基本上,这样你就不会隐藏:

因此,只要您注意不做这些事情,就可以捕获通用异常。例如,您可以通过其他方式向用户提供有关异常的信息,例如:

  • 在 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: 不会为您提供要检查的异常对象
  • SystemExitKeyboardInterruptGeneratorExit 的异常没有被上面的代码捕获,这通常是你想要的。见 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/

相关文章:

python - 转储 yaml 时如何保留键值缩进

java - 为什么我的Java程序在捕获异常后退出?

java - 在 Java 中创建异常的一般经验法则是什么?

快速返回或抛出

c# - 从 bool 方法捕获异常消息

python - 让 pandas Wide_to_long() 函数考虑 stub 在列名的末尾而不是开头

python - 根据列表过滤列表的 Pandas 列

python - 关于在 Bokeh 中使用的数据

python - 为什么上下文管理器不关闭文件描述符?

php - Symfony3 自定义异常返回 JSON 响应