2009-10-29 17 views
13

मैं पाइथन 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 वर्कअराउंड के साथ रिपोर्ट किया गया है। सुझाए गए हैक्स मूल रूप से एक कोशिश/पकड़ में भागते हैं और फिर sys.excepthook(*sys.exc_info())

+1

धन्यवाद - तीसरा कामकाज पूरी तरह से काम करता है! – Sebastian

8

ऐसा लगता है कि यह बग अभी भी कम से कम 3.4 (और कम से कम) 3.4 में मौजूद है, और चर्चा में कामकाज में से एक काम नाडिया अलरामली लिंक पाइथन में काम करता है 3.4 भी।

सुविधा और दस्तावेज़ीकरण के लिए, मैं कोड (मेरी राय में) यहां सबसे अच्छा कामकाज के लिए कोड पोस्ट करूंगा। मैंने कोडिंग शैली को अद्यतन किया और इसे और अधिक पीईपी 8 और पायथनिक बनाने के लिए टिप्पणियां दीं।

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 
संबंधित मुद्दे