我经历了“Logging uncaught exceptions in 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
时(不在web-app中),它可以正常工作。正确调用新方法(overriden)。
知道为什么会出现这种不同的行为?
答案 0 :(得分:5)
使用web.py,自己捕获异常的一种方法是add a custom processor:
...
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将捕获异常并显示默认错误消息。
答案 1 :(得分:2)
Python doc说
sys.excepthook(type,value,traceback)
此函数打印出sys.stderr的给定回溯和异常。
因此当需要将异常打印到终端时调用此sys.excepthook
。现在你看,web.py本身处理异常。如果你没有分配sys.excepthook,webpy会捕获异常并在浏览器中显示异常。并且由于web.py本身正在处理异常,因此设置sys.excepthook
不会发生任何变化。
如果web.py本身没有处理异常,那么它将被取消,并且sys.excepthook
将被调用。
如果您真的想在此代码中自己处理异常,请尝试搜索web.py doc和源代码,以了解web.py如何处理异常并自定义异常。
python doc也说
sys.__excepthook__
这些对象包含程序开头的displayhook和excepthook的原始值。它们被保存,以便可以恢复displayhook和excepthook,以防它们碰巧被破碎的物体替换。
所以我的猜测是web.py,所以你的自定义处理程序不会被调用。