を独自のレンダリングメカニズムの例外がスレッドのスレッドかどうか[重複]
-
13-09-2019 - |
質問
この質問に答えはこちら
も同様の質問:あなたの供給に答えます。
場を作りたいスレッドによ threading.Thread
, し、その例外をスローする独自のレンダリングメカニズムと、スレッドが終了します。いを保持するのにデフォルトの印刷例外の詳細はスタックトレースでのプロセス全体としてます。
っとすることは可能ではなくすべての例外のスレッドは、reraiseのメインスレッドオブジェクトになるのかもしれないしで手動で行うデフォルトの例外処理を上げる SystemExit
メインスレです。
どの道のりは有りますか?
解決
について書いたもの 再投Python例外, どうもこのようにします。
自作業者のスレッドうす(Python2.x、下記を参照してくださいPython3.x版):
try:
self.result = self.do_something_dangerous()
except Exception, e:
import sys
self.exc_info = sys.exc_info()
は、メインスレッドについ:
if self.exc_info:
raise self.exc_info[1], None, self.exc_info[2]
return self.result
の例外が表示され、メインスレッドだったので、ワーカスレです。
Python3.x:
try:
self.result = self.do_something_dangerous()
except Exception as e:
import sys
self.exc_info = sys.exc_info()
は、メインスレッド:
if self.exc_info:
raise self.exc_info[1].with_traceback(self.exc_info[2])
return self.result
他のヒント
セカンダリスレッドが確実にメインスレッドに上げることができる唯一の例外はKeyboardInterrupt
です:セカンダリスレッドがする方法は、それは<のhref = "https://docs.python.org/3/library/関数を呼び出すことです「REL = "nofollowをnoreferrer"> thread.interrupt_main()
の_thread.interrupt_main _thread.html#。後者のいつも単なるKeyboardInterrupt
- 上げます例外オブジェクトを(例外の理由について)余分な情報を関連付ける方法はありません。だから、あなたは、例えば、どこか離れて、その情報を隠しておく必要があります Queue.Queueするの専用インスタンス上で - その情報は、セカンダリスレッドがsys.exc_info()
を経由して取得することができ、結果を含むかもしれない、と何か他のものは、あなたはもちろんの便利。
メインスレッドは制御-Cなどを打つため、ユーザーにキーボード割り込みが実際にある場合は、キューが空になることを考慮に入れ、余分な情報を回復する(と取る必要があるので、使用get_nowait
をしてできるようになります)例えば、Queue.Empty
例外を扱う、フォーマットすべてのセカンダリスレッドがある場合、それはしかし、あなたが(希望、および終了<のhref = "http://docs.python.org/library/threading.html?highlight=thread%20mainメインスレッドが終了すると、#1 threading.Thread.daemon」REL = "nofollowをnoreferrer">デーモンのSは、全体の処理)を終了する。
非常に残念なことに答えていないの問題をもたらしていました。おうパイプの例外の詳細にキューに挿入しますご覧ください: チスレッドの例外は呼び出し側スレッドにPython