Python では、マルチスレッド プログラミングによりタスクを同時に実行できます。ただし、マルチスレッド コンテキストでの例外処理は困難になる場合があります。この記事では、子スレッドで発生する例外を親スレッドからキャッチするという特定の問題について説明します。
この問題は、子スレッドが独自のコンテキストとスタックで独立して動作するために発生します。子スレッドでスローされた例外は、親スレッドにはすぐには表示されません。以下に示すように、親スレッド内の従来の try-excel ブロックは機能しません:
try: threadClass.start() ##### **Exception takes place here** except: print "Caught an exception"
これに対処するには、メッセージ パッシングを利用できます。子スレッドは、キューのような共有データ構造を使用して親スレッドに例外情報を送信できます。
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()
この例では:
メッセージ パッシングを使用すると、スレッド間で例外を効率的に通信できます。
以上がPython で親スレッドで子スレッドの例外をキャッチするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。