在excepthook中打印原始异常

use*_*231 5 python exception-handling exception

我正在设置sys.excepthook,以便我可以记录发生的每个异常.不要写入日志,而是使用以下示例:

def excepthook(self, type_, value, traceback):
    print "\n"
    print type_
    print value
    print traceback
    print "\n"

sys.excepthook = self.excepthook
Run Code Online (Sandbox Code Playgroud)

现在假设我创建了一个类型错误,如下所示:

print 3 + str(2)
Run Code Online (Sandbox Code Playgroud)

没有被抓住,这进入了异常情况并正确打印出3个变量:

<type 'exceptions.TypeError'>
unsupported operand type(s) for +
<traceback object at 0x02BAE800>
Run Code Online (Sandbox Code Playgroud)

我想做的是,它还打印出发送到excepthook的完整异常(因此,在这种情况下,是一个TypeException).换句话说,我希望它也显示以下信息).

Traceback (most recent call last):
  File "testcidnelite.py", line 13, in <module>
    print 3 + str(2)
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Run Code Online (Sandbox Code Playgroud)

如果我添加以下行:

raise
Run Code Online (Sandbox Code Playgroud)

它会正确显示异常; 但是,它也会在术语"加速"时显示错误:

Error in sys.excepthook:
Traceback (most recent call last):
  File "C:\psi-test-automation\Selenium\TestMethods2.py", line 145, in  excepthook
    raise
TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType 
Run Code Online (Sandbox Code Playgroud)

改为:

raise type_
Run Code Online (Sandbox Code Playgroud)

将打印出以下错误:

Error in sys.excepthook:
Traceback (most recent call last):
  File "C:\psi-test-automation\Selenium\TestMethods2.py", line 145, in excepthook
    raise type_
TypeError

Original exception was:
Traceback (most recent call last):
  File "testcidnelite.py", line 13, in <module>
    print 3 + str(2)
TypeError: unsupported operand type(s) for +: 'int' and 'str'
Run Code Online (Sandbox Code Playgroud)

我希望它只打印出第二个块(原始异常).这可能吗?

小智 8

您可以使用Python的traceback模块来格式化异常.

from traceback import format_exception

def excepthook(self, type_, value, traceback):
    print format_exception(type_, value, traceback)

sys.excepthook = self.excepthook
Run Code Online (Sandbox Code Playgroud)

查看官方文档以获取更多信息和示例.

  • 为了打印格式正确的异常,我认为print_exception方法更好,根据`format_exception`的文档:返回值是一个字符串列表,每个字符串以换行符结尾,一些包含内部换行符.当连接和打印这些行时,打印的文本与`print_exception()`完全相同. (2认同)