ブロック内で例外を発生except:
させようとしていますが、インタープリターは役に立ち、「強制的に」スタック トレースを出力しようとします。これを回避することは可能ですか?
少しの背景情報: Python のTUI ライブラリである urwid をいじっています。ユーザー インターフェイスは、 を呼び出して開始し、を上げurwid.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
に変更できません。KeyboardInterrupt
これを解決するパターンはありますか?