如何减少 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_tb
和 limit=1
的使用,以限制堆栈跟踪输出。 traceback
模块中有很多这样的函数。
我有这行 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_tb
和 limit=1
的使用,以限制堆栈跟踪输出。 traceback
模块中有很多这样的函数。