首页 > 解决方案 > 如何减少 Python 的异常提升输出?

问题描述

我有这行 Python 代码:

raise ValueError(f"Invalid input '{number}'")

当它引发异常时,我得到:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/snowcrash/Code/Python/mycode/mycode.py", line 8, in __init__
    raise ValueError(f"Invalid input '{number}'")
ValueError: Invalid input 'a1b2c3'

但是我更愿意得到:

File "/home/snowcrash/Code/Python/mycode/mycode.py", line 8, in __init__
  ValueError: Invalid input 'a1b2c3'

我如何实现这一目标?

标签: pythonpython-3.8

解决方案


sys.excepthook(type, value, traceback)是在引发异常时执行打印的函数。您可以编写自己的函数(具有类似的签名)并简单地将其替换为:

sys.excepthook = myfunction

你可以在这个函数中做任何你想做的事情。例如,您可以记录到文件,或打印有关异常发生时程序状态的一些信息。您甚至可以根据异常的类型安排不同的事情发生。

但是,如果您只想格式化回溯消息,那么已经为您提供了许多方便的东西。您可以深入研究traceback文档以获取详细信息,但这里有一个示例可以大致生成您想要的输出:

import sys, traceback


def myhook(type, value, tb):
    trace = traceback.format_tb(tb, limit=1)
    trace = trace[0].split("\n")[0]
    exc = traceback.format_exception_only(type, value)[0]
    print(trace + "\n" + exc)


sys.excepthook = myhook

number = "a1b2c3"
raise ValueError(f"Invalid input {number}")

产生以下输出:

  File "scratch/so.py", line 14, in <module>
ValueError: Invalid input a1b2c3

特别注意使用traceback.format_tbwithlimit=1来限制堆栈跟踪输出。模块中有很多这样的功能traceback


推荐阅读