更改python中未捕获的异常处理的默认行为

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).

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

mat*_*ata 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()
...
Run Code Online (Sandbox Code Playgroud)

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


Sar*_*rim 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 文档还说

sys.__excepthook__

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

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