2

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

  1. 我尝试抛出不是ExceptionorExceptionBase的东西,解释器告诉我我只能抛出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. 一些框架已经为您捕获了所有错误,因此从框架代码层下获取消息并不容易。抛出框架代码没有捕捉到的东西可能是绕过它的好策略(这不仅仅是一个理论案例,我之前做过)。
4

1 回答 1

3

import types

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

编辑:

虽然感觉它应该工作,但它没有。这是一个hacky方式:

import sys

try:
    raise Foo()
except:
    etype, foo, traceback = sys.exc_info()
    print 'foo %s' % foo
else:
    print 'it\'s all good'
于 2012-11-09T21:58:07.227 回答