Python 在每个异常上显示自定义错误消息/回溯
Python display custom error message / traceback on every exception
Python 是否支持为每个异常/引发/断言显示相同的自定义错误消息的方法(无论代码在哪里中断)?
我目前的破解方法是使用装饰器。我有一个函数 main
并且它可以很好地显示回溯,但我希望它在每次抛出任何错误时也打印 my_var
(在函数范围内)。所以很明显这有一个范围问题——它只是为了说明我想做什么。任何想法表示赞赏。
import traceback
def exit_with_traceback(func, *args, **kwargs):
def wrap(*args, **kwargs):
try:
return func(*args, **kwargs)
except:
# how do I get this to print my_var AND the traceback?
print(traceback.format_exc())
return wrap
@exit_with_traceback
def main(bar=1):
my_var = 'hello world' # variable specific to main()
return bar + 1
main(bar=None) # run main() to throw the exception
您可以尝试覆盖 sys
模块中的 excepthook 函数。来自其文档:
When an exception is raised and uncaught, the interpreter calls
sys.excepthook with three arguments, the exception class, exception
instance, and a traceback object.
因此代码可能看起来像这样(我使用了您的示例):
import sys
# define custom exception hook
def custom_exception_hook(exc_type, value, traceback):
print('Custom exception hook')
print('Type:', exc_type)
print('Value:', value)
print('Traceback:', traceback)
lc = traceback.tb_next.tb_frame.f_locals
print(lc.get('my_var')) # this prints "hello world"
# override the default exception hook
sys.excepthook = custom_exception_hook
def main(bar=1):
my_var = 'hello world' # variable specific to main()
return bar + 1
main(bar=None) # run main() to throw the exception
sys.excepthook
的覆盖在 IDLE 中不起作用,但它在命令行中工作得很好。希望这会有所帮助。
Python 是否支持为每个异常/引发/断言显示相同的自定义错误消息的方法(无论代码在哪里中断)?
我目前的破解方法是使用装饰器。我有一个函数 main
并且它可以很好地显示回溯,但我希望它在每次抛出任何错误时也打印 my_var
(在函数范围内)。所以很明显这有一个范围问题——它只是为了说明我想做什么。任何想法表示赞赏。
import traceback
def exit_with_traceback(func, *args, **kwargs):
def wrap(*args, **kwargs):
try:
return func(*args, **kwargs)
except:
# how do I get this to print my_var AND the traceback?
print(traceback.format_exc())
return wrap
@exit_with_traceback
def main(bar=1):
my_var = 'hello world' # variable specific to main()
return bar + 1
main(bar=None) # run main() to throw the exception
您可以尝试覆盖 sys
模块中的 excepthook 函数。来自其文档:
When an exception is raised and uncaught, the interpreter calls sys.excepthook with three arguments, the exception class, exception instance, and a traceback object.
因此代码可能看起来像这样(我使用了您的示例):
import sys
# define custom exception hook
def custom_exception_hook(exc_type, value, traceback):
print('Custom exception hook')
print('Type:', exc_type)
print('Value:', value)
print('Traceback:', traceback)
lc = traceback.tb_next.tb_frame.f_locals
print(lc.get('my_var')) # this prints "hello world"
# override the default exception hook
sys.excepthook = custom_exception_hook
def main(bar=1):
my_var = 'hello world' # variable specific to main()
return bar + 1
main(bar=None) # run main() to throw the exception
sys.excepthook
的覆盖在 IDLE 中不起作用,但它在命令行中工作得很好。希望这会有所帮助。