我读过这篇文章http://docs.python.org/2/tutorial/errors.html两次以确保。它完全回避了这个话题。
- 我尝试抛出一些不是
Exception
或ExceptionBase
的东西,解释器告诉我我只能抛出ExceptionBase
-esque并且旧式类的对象。 - 所以我尝试抛出旧式类的对象:
>>> 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
>>>
惊讶...那么,我如何捕获所有这些并检查捕获的内容?
编辑:
动机。
- 过度防御性编码从来都不是坏习惯。假设我正在编写一个守护程序,为什么我不尝试通过做一些在其他标准看来微不足道的事情来尽可能避免潜在的危险呢?
- 程序并不总是在友好的环境中运行,有时其他程序会尝试破坏您的程序,在这种情况下您确实需要防止各种错误。有时这是有道理的。想想,例如一个 CGI 实现 - 如果某个租用服务器一部分的白痴在其中放入了一个脚本,从而引发了这个“意外”错误,您是否希望整个服务器宕机?
- 某些框架已经为您捕获了所有错误,因此从框架代码层下获取消息并不容易。抛出框架代码无法捕获的内容可能是绕过该问题的一个好策略(这不仅仅是一个理论案例,我以前就这样做过)。
最佳答案
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/