4

我经历了“在 Python 中记录未捕获的异常”。而且,我试过这个:

import web
import sys

app = web.application((
  '/test', 'test'), globals())

def test_func(e_type, value, traceback):
  print "Handled exception here.."

class test:
  def GET(self):
    a = 1/0

if __name__ == "__main__":
  sys.excepthook = test_func
  app.run()

在这里,你可以很容易地看到GET /test请求是否进来,我是故意提高ZerDivisionError的。正如我已经覆盖sys.excepthook,我希望方法test_func执行ZeroDivisionError

然而,这段代码没有按预期工作。我观察到,当我尝试excepthook在独立代码(而不是网络应用程序)中覆盖时,它工作正常。新方法(覆盖)被正确调用。

知道为什么会有这种不同的行为吗?

4

2 回答 2

5

使用 web.py,自己捕获异常的一种方法是添加一个自定义处理器

...
def error_processor(handler):
   try:
       handler()
   except:
       # do something reasonable to handle the exception
       return 'something happened...'

app.add_processor(error_processor)
app.run()
...

否则 web.py 将捕获异常并显示默认错误消息。

于 2013-09-15T10:50:12.143 回答
2

Python 文档说

sys.excepthook(类型,值,回溯)

此函数将给定的回溯和异常打印到 sys.stderr。

因此sys.excepthook,当需要将异常打印到终端时调用它。现在您看到了,web.py 本身处理了异常。如果不指定 sys.excepthook,webpy 会捕获异常并在浏览器中显示异常。由于 web.py 本身正在处理异常,因此设置sys.excepthook不会改变。如果 web.py 本身没有处理异常,那么它将未被捕获并被sys.excepthook调用。

如果您真的想在这段代码中自己处理异常,请尝试搜索 web.py 文档和源代码,以了解 web.py 如何处理异常并对其进行自定义。

python doc还说

sys.__excepthook__

这些对象包含程序开始时 displayhook 和 excepthook 的原始值。它们被保存,以便在它们碰巧被损坏的对象替换时可以恢复 displayhook 和 excepthook。

所以我的猜测是 web.py 使用它,所以你的自定义处理程序不会被调用。

于 2013-09-15T10:23:28.980 回答