2009-10-29 8 views
13

Python 2.5 kullanıyorum ve programımda kendi tanımlanmış bir excepthook kullanmaya çalışıyorum. Ana iş parçacığında mükemmel çalışır. Ancak diş açma modülü ile başlayan bir iş parçacığında her zamanki excepthook çağrılır.'sys.excepthook' ve iş parçacığı

Sorunu gösteren bir örnek aşağıdadır. Yorumun kaldırılmaması istenen davranışı gösterir. Yani

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() 

, nasıl dizisindeki excepthook kendi kullanabilirim?

cevap

9

Geçici çözümlerle ilgili bir hata bildirildi here. Önerilen kesmeler temelde bir try/catch içinde çalışmayı tamamlar ve sonra sys.excepthook(*sys.exc_info())

+1

Teşekkürler - üçüncü geçici çözüm mükemmel çalışıyor! – Sebastian

8

'u arayın. Bu hatanın hâlâ (en az) 3.4'te mevcut gibi görünüyor ve Nadia Alramli'nin bağlantılı olduğu çözümlerden biri Python'da çalışıyor gibi görünüyor. 3.4 de.

Kolaylık ve dokümantasyon için, kodu (burada) en iyi çözümü burada yayınlayacağım. Kodlama stilini ve yorumları daha fazla PEP8 ve Pythonic yapmak için biraz güncelledim.

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