を独自のレンダリングメカニズムの例外がスレッドのスレッドかどうか[重複]

StackOverflow https://stackoverflow.com/questions/1854216

質問

この質問に答えはこちら

も同様の質問:あなたの供給に答えます。

場を作りたいスレッドによ 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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top