[解決済み】スレッドの例外を呼び出し側のスレッドでキャッチする?
2022-04-04 07:35:54
質問
私はPythonと一般的なマルチスレッドプログラミングの非常に新しい人です。 基本的に、私はファイルを別の場所にコピーするスクリプトを持っています。 私はこれを別のスレッドに配置し、以下を出力できるようにしたいと思います。
....
を使用して、スクリプトがまだ実行中であることを示します。
問題は、ファイルをコピーできない場合、例外が発生することです。 メインスレッドで実行している場合は問題ないのですが、以下のようなコードではうまくいきません。
try:
threadClass = TheThread(param1, param2, etc.)
threadClass.start() ##### **Exception takes place here**
except:
print "Caught an exception"
スレッドクラス自体で、例外を再スローしようとしましたが、うまくいきません。 ここで同じような質問をしている人を見ましたが、みんな私がやろうとしていることよりもっと具体的なことをしているようです(そして提示された解決策をよく理解していないのです)。私は、人々が
sys.exc_info()
しかし、どこで、どのように使用すればよいのかわかりません。
編集する スレッドクラスのコードは以下の通りです。
class TheThread(threading.Thread):
def __init__(self, sourceFolder, destFolder):
threading.Thread.__init__(self)
self.sourceFolder = sourceFolder
self.destFolder = destFolder
def run(self):
try:
shul.copytree(self.sourceFolder, self.destFolder)
except:
raise
解決方法は?
問題は
thread_obj.start()
はすぐに返します。生成した子スレッドは自分のコンテキストで実行され、自分のスタックを持っています。そこで発生した例外はすべて子スレッドのコンテキストにあり、子スレッド自身のスタックにある。この情報を親スレッドに伝える方法として今思いつくのは、ある種のメッセージパッシングを使用することです。
試しに着てみてください。
import sys
import threading
import Queue
class ExcThread(threading.Thread):
def __init__(self, bucket):
threading.Thread.__init__(self)
self.bucket = bucket
def run(self):
try:
raise Exception('An error occured here.')
except Exception:
self.bucket.put(sys.exc_info())
def main():
bucket = Queue.Queue()
thread_obj = ExcThread(bucket)
thread_obj.start()
while True:
try:
exc = bucket.get(block=False)
except Queue.Empty:
pass
else:
exc_type, exc_obj, exc_trace = exc
# deal with the exception
print exc_type, exc_obj
print exc_trace
thread_obj.join(0.1)
if thread_obj.isAlive():
continue
else:
break
if __name__ == '__main__':
main()
関連
-
[解決済み】 'numpy.float64' オブジェクトは反復可能ではない
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] リスト内のアイテムのインデックスを検索する
-
[解決済み] 複数の例外を1行でキャッチする(ブロックを除く)
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] Javaにおける "implements Runnable "と "extends Thread "の違いについて
-
[解決済み] JUnit 4のテストで、ある例外が投げられたことをどのように断言しますか?
-
[解決済み] プロセスとスレッドの違いは何ですか?
-
[解決済み】プログラムを停止/終了させることなく、完全な例外トレースバックをキャッチして表示する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonコンテナのための組み込み汎用関数操作
-
python implement mysql add delete check change サンプルコード
-
風力制御におけるKS原理を深く理解するためのpythonアルゴリズム
-
FacebookオープンソースワンストップサービスpythonのタイミングツールKats詳細
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み】「SyntaxError.Syntax」は何ですか?Missing parentheses in call to 'print'」はPythonでどういう意味ですか?
-
[解決済み】"No JSON object could be decoded "よりも良いエラーメッセージを表示する。
-
[解決済み】Python: SyntaxError: キーワードは式になり得ない
-
[解決済み] スレッドを強制終了させる方法はありますか?
-
[解決済み】どのPythonパッケージがスタンドアロンイベントシステムを提供しますか?[クローズド]。