如何减少Python异常信息的输出?

3

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

我该如何实现这个目标?

1
我会说,捕获异常并格式化自己的错误消息。如果你无法从那一点恢复,就终止程序;否则,进行恢复并继续执行。一个脚本或程序的正确性不应该依赖于执行环境捕获异常的能力。 - Ronald
1
追踪回溯的目的是为了提供尽可能多的信息来进行调试。你是想提供调试信息,还是只是告知用户输入错误?在合并调用时,你的标准是什么?假设你的代码不直接引发异常,而是调用另一个最终会引发异常的函数,你是否也想抑制你的代码,并只显示一些实现细节的内部内容? - MisterMiyagi
1个回答

3

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

sys.excepthook = myfunction

在此函数中,您可以进行任何操作。例如,您可以记录到文件中或打印关于程序出现异常时的状态信息。甚至可以根据异常类型安排不同的事件发生。

但是,如果您只想格式化 traceback 消息,则已为您提供了许多方便的东西。您可以查看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模块中有许多这样的函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接