我怎么能保留原来的异常回调

时间:2015-11-18 03:35:53

标签: python

目前,如果我执行sample.py,我可以获取导出文本文件的异常信息。

然而,一旦异常发生,程序就不会显示异常和屏幕,

并且它不会执行以下代码。所以我在终端

上看不到字符串"you should check the result on export file"

我怎么能得到我想要的东西。感谢〜

exception_hook.py

def handleException(excType, excValue, trace):
    file = StringIO()
    cgitb.Hook(file=file, display=True, format='text')(excType, excValue, trace)
    ...
sys.excepthook = handleException

sample.py

import excepthook
def test_divide_zero_exception():
    register_exception_sender("Test")
    1/0
    print("you should check the result on export file")

2 个答案:

答案 0 :(得分:1)

在Python 2.7中,这是documentation of sys.excepthook()

  

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

     

当引发异常并且未被捕获时,解释器使用三个参数调用sys.excepthook,异常类,异常实例和回溯对象。在交互式会话中,这发生在控制返回到提示之前;在Python程序中就在程序退出之前发生。可以通过为sys.excepthook分配另一个三参数函数来自定义这种顶级异常的处理。

(文档为substantially the same in 3.x。)

没有合理的可能性(没有摆弄字节码和实现细节,或者对代码执行高度复杂的AST转换)以便在异常发生的地方恢复执行。通过调用原始的sys.excepthook()函数, 可以获得打印回溯的“标准”行为:

import sys
original_excepthook = sys.excepthook

def handleException(excType, excValue, trace):
    file = StringIO()
    cgitb.Hook(file=file, display=True, format='text')(excType, excValue, trace)
    ...
    original_excepthook(excType, excValue, trace)

 sys.excepthook = handleException

除了您安装的任何自定义之外,这将正常打印回溯。但是,它不允许您恢复发生异常的位置。如果您想根据具体情况处理异常,则需要使用try/except代替。

答案 1 :(得分:0)

  

并且它不会执行以下代码。所以我没有看到字符串   "你应该检查导出文件的结果"在终端上

我认为当你真正需要一个try-except块时,你正试图做一些太复杂的事情。

import traceback
try:
    x = 1/0
    self.some_code_that_depends_on_x(x)

except: # try to catch specific exceptions here 
    traceback.print_exc(file=sys.stderr) # or your exception file

print("you should check the result on export file") # the following code works