2009-10-29 14 views
13

私はPython 2.5を使用していて、自己定義のexcepthookを自分のプログラムに使用しようとしています。メインスレッドでは完全に正常に動作します。しかし、スレッドモジュールで開始されたスレッドでは、通常excepthookが呼び出されます。'sys.excepthook'とスレッディング

これは、問題を示す例です。コメントをコメント解除すると、目的の動作が示されます。

import threading, sys 

def myexcepthook(type, value, tb): 
    print 'myexcepthook' 

class A(threading.Thread, object): 

    def __init__(self): 
     threading.Thread.__init__(self, verbose=True) 
#  raise Exception('in main') 
     self.start() 

    def run(self): 
     print 'A' 
     raise Exception('in thread')    

if __name__ == "__main__": 
    sys.excepthook = myexcepthook 
    A() 

スレッド内で自分自身のexcepthookを使用するにはどうすればよいですか?

答えて

9

回避策でhere報告関連のバグがあるように見えます。提案されたハックは、基本的にtry/catchでラップして実行します。sys.excepthook(*sys.exc_info())

+1

おかげ - 第三の回避策は完璧に動作します! – Sebastian

8

このバグは(少なくとも)3.4に存在し、ディスカッションNadia Alramliリンクの回避策の1つはPythonで動作するようです3.4も。

ここでは、便宜と文書化のために、私の意見ではコードを掲載します。コーディングスタイルとコメントを少し更新してPEP8とPythonicにしました。

import sys 
import threading 

def setup_thread_excepthook(): 
    """ 
    Workaround for `sys.excepthook` thread bug from: 
    http://bugs.python.org/issue1230540 

    Call once from the main thread before creating any threads. 
    """ 

    init_original = threading.Thread.__init__ 

    def init(self, *args, **kwargs): 

     init_original(self, *args, **kwargs) 
     run_original = self.run 

     def run_with_except_hook(*args2, **kwargs2): 
      try: 
       run_original(*args2, **kwargs2) 
      except Exception: 
       sys.excepthook(*sys.exc_info()) 

     self.run = run_with_except_hook 

    threading.Thread.__init__ = init 
関連する問題