python:我怎么知道发生了什么类型的异常?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python:我怎么知道发生了什么类型的异常?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1740字,纯文字阅读大概需要3分钟。
内容图文
我有一个主程序调用的函数:
try:
someFunction()
except:
print "exception happened!"
但是在函数执行过程中它会引发异常,所以它会跳转到except部分.
我怎样才能确切地看到导致异常发生的someFunction()中发生了什么?
解决方法:
其他答案都指出你不应该抓住一般的例外,但似乎没有人想告诉你为什么,这对理解何时可以打破“规则”至关重要. 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
确保以难以忘记的方式引起用户注意!如上所示,如果将消息隐藏在许多其他消息中,则打印它可能是不够的.没有引起用户的注意就等于吞下所有异常,如果有一个印象,你应该在阅读了这个页面上的答案后离开,这就是这不是一件好事.使用raise语句结束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!")
如果你想深入挖掘并检查堆栈,查看变量等,请使用except块内的pdb模块的post_mortem函数:
import pdb
pdb.post_mortem()
我发现这最后一种方法在追捕bug时非常宝贵.
内容总结
以上是互联网集市为您收集整理的python:我怎么知道发生了什么类型的异常?全部内容,希望文章能够帮你解决python:我怎么知道发生了什么类型的异常?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。