如何减少 Python 的异常引发输出?

How can I reduce Python's Exception raising output?

我有这行 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'

如何实现?

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_tblimit=1 的使用,以限制堆栈跟踪输出。 traceback 模块中有很多这样的函数。