python - 如何捕获所有错误并引用抛出的错误?

标签 python exception

我读过这篇文章http://docs.python.org/2/tutorial/errors.html两次以确保。它完全回避了这个话题。

  1. 我尝试抛出一些不是ExceptionExceptionBase的东西,解释器告诉我我只能抛出ExceptionBase-esque并且旧式类的对象。
  2. 所以我尝试抛出旧式类的对象:

>>> class Foo():
...     pass
... 
>>> try:
...     raise Foo()
... except Exception as foo:
...     print 'foo %s' % foo
... except:
...     print 'not an exception'
... else:
...     print 'it\'s all good'
... 
not an exception
>>> 

惊讶...那么,我如何捕获所有这些并检查捕获的内容?

编辑:

动机。

  1. 过度防御性编码从来都不是坏习惯。假设我正在编写一个守护程序,为什么我不尝试通过做一些在其他标准看来微不足道的事情来尽可能避免潜在的危险呢?
  2. 程序并不总是在友好的环境中运行,有时其他程序会尝试破坏您的程序,在这种情况下您确实需要防止各种错误。有时这是有道理的。想想,例如一个 CGI 实现 - 如果某个租用服务器一部分的白痴在其中放入了一个脚本,从而引发了这个“意外”错误,您是否希望整个服务器宕机?
  3. 某些框架已经为您捕获了所有错误,因此从框架代码层下获取消息并不容易。抛出框架代码无法捕获的内容可能是绕过该问题的一个好策略(这不仅仅是一个理论案例,我以前就这样做过)。

最佳答案

import types

try:
    raise Foo()
except (Exception, types.InstanceType) as foo:
    print 'foo %s' % foo
else:
    print 'it\'s all good'

编辑:

虽然感觉应该有效,但事实并非如此。这是一个黑客方法:

import sys

try:
    raise Foo()
except:
    etype, foo, traceback = sys.exc_info()
    print 'foo %s' % foo
else:
    print 'it\'s all good'

关于python - 如何捕获所有错误并引用抛出的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13316540/

相关文章:

python - 无法让 Py2exe 正确编译为一个 exe

python - 使用 Python Virtualbox API 有什么优势?

python - 为什么对未 pickle 的 cifar10 数据集进行 pickle 会产生不同的大小?

c# - 为什么 try block 中的代码与方法的其余部分分开?

python - 如何在 OSX 10.9 (Mavericks ) 上安装 pybluez 或 LightBlue

python - 实现自定义最大功能

java - 非法监控状态异常

c++ - 我可以捕获在 main() 之前抛出的异常吗?

c++ - 线程之间的异常。我需要多少 std::exception_ptr 和同步?

javascript - 了解 JavaScript 中的异常处理 : get different output when changed the place of try/catch block