Aas*_*h P 4 python exception-handling sys python-2.7
我经历了" 在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()
Run Code Online (Sandbox Code Playgroud)
在这里,您可以轻松查看是否有GET /test请求,我故意提出ZerDivisionError.正如我已经覆盖sys.excepthook,我希望方法test_func执行ZeroDivisionError.
然而,这段代码并没有按照预期工作.我观察到,当我尝试覆盖excepthook独立代码(不在web-app中)时,它工作正常.正确调用新方法(overriden).
知道为什么这种不同的行为?
使用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()
...
Run Code Online (Sandbox Code Playgroud)
否则web.py将捕获异常并显示默认错误消息.
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 文档还说
sys.__excepthook__这些对象包含程序开始时的 displayhook 和 excepthook 的原始值。它们被保存起来,以便在 Displayhook 和 excepthook 碰巧被损坏的对象替换时可以恢复。
所以我的猜测是 web.py 使用它,所以你的自定义处理程序不会被调用。
| 归档时间: |
|
| 查看次数: |
1548 次 |
| 最近记录: |