我试图在一个except:
块中引发异常,但解释器试图提供帮助并“强制”打印堆栈跟踪。有可能避免这种情况吗?
一点背景信息:我正在玩 urwid,一个Python 的TUI 库。用户界面由 call 开始,由raiseurwid.MainLoop.run()
结束。到目前为止,这工作正常,但是当引发另一个异常时会发生什么?例如,当我正在捕捉(urwid MainLoop 没有)时,我会进行一些清理并希望通过引发适当的异常来结束用户界面。但这会导致屏幕充满堆栈跟踪。 urwid.ExitMainLoop()
KeyboardInterrupt
一些小的研究表明,python3 可以记住链式异常,并且可以使用 'cause': 显式引发异常raise B() from A()
。我学习了一些方法来更改或附加有关引发的异常的数据,但我发现无法“禁用”此功能。我想避免打印堆栈跟踪和行之类The above exception was the direct cause of...
的,而只是在一个块内引发接口结束异常,except:
就像我在一个块之外一样。
这是可能的还是我在做一些根本错误的事情?
编辑:这是一个类似于我当前架构的示例,导致同样的问题:
#!/usr/bin/env python3
import time
class Exit_Main_Loop(Exception):
pass
# UI main loop
def main_loop():
try:
while True:
time.sleep(0.1)
except Exit_Main_Loop as e:
print('Exit_Main_Loop')
# do some UI-related clean up
# my main script
try:
main_loop()
except KeyboardInterrupt as e:
print('KeyboardInterrupt')
# do some clean up
raise Exit_Main_Loop() # signal the UI to terminate
不幸的是,我也无法更改main_loop
为 except KeyboardInterrupt
。有解决这个问题的模式吗?