दिलचस्प पोस्ट
ट्विटर उपयोगकर्ता नाम के लिए regex प्ले पर शोकहारा! ढांचा यदि वर्तमान एएसपी.नेट सत्र निरर्थक है तो मुझे क्या करना चाहिए? एडीबी शुरू नहीं होगा सुपरक्लास कंस्ट्रक्टर को फोन करने के लिए नियम क्या हैं? संपूर्ण फ़ाइल को पढ़ने के बिना छवि आयाम प्राप्त करना कैसे mysql डेटाबेस के लिए सुपर विशेषाधिकार जोड़ने के लिए? एक्स 64 निर्देश एक 32 बिट रजिस्टर के ऊपरी भाग को क्यों शून्य करते हैं क्या पृष्ठ संकेतक बिंदु रंग को बदलने का एक तरीका है <Marquee> टैग की जगह जावास्क्रिप्ट मार्की प्रोटोटाइप का उपयोग करने के लिए जावास्क्रिप्ट अतुल्यकालिक यूआरएल अनुरोध कैसे भेजें? मैं स्विच स्टेटमेंट में मानों की एक श्रेणी का चयन कैसे करूं? स्टोरीबोर्ड – AppDelegate में ViewController का संदर्भ लें मैं Python में urllib2 वाले पृष्ठों को कैसे प्राप्त कर सकता हूं?

अजगर में अयोग्य अपवाद लॉगिंग

क्या आप stderr बजाय logging मॉड्यूल के माध्यम से आउटपुट के लिए अयोग्य अपवाद पैदा करते हैं?

मुझे ऐसा करने का सबसे अच्छा तरीका है:

 try: raise Exception, 'Throwing a boring exception' except Exception, e: logging.exception(e) 

लेकिन मेरी स्थिति इतनी है कि यह वास्तव में अच्छा होगा अगर logging.exception(...) स्वचालित रूप से तब लागू हो जाता था जब अपवाद पकड़ा नहीं जाता है।

वेब के समाधान से एकत्रित समाधान "अजगर में अयोग्य अपवाद लॉगिंग"

जैसा कि sys.excepthook ने बताया, हर बार एक अपवाद उठाया जाता है और बिना किसी sys.excepthook स्थिति में sys.excepthook लागू sys.excepthook है। इसका व्यावहारिक निहितार्थ यह है कि आपके कोड में आप sys.excepthook के डिफ़ॉल्ट व्यवहार को ओवरराइड कर सकते हैं जो आप चाहते हैं ( logging.exception का उपयोग कर सहित)।

एक पुआल आदमी उदाहरण के रूप में:

 >>> import sys >>> def foo(exctype, value, tb): ... print 'My Error Information' ... print 'Type:', exctype ... print 'Value:', value ... print 'Traceback:', tb ... 

ओवरराइड sys.excepthook :

 >>> sys.excepthook = foo 

स्पष्ट सिंटैक्स त्रुटि को तैयार करें (कोलन छोड़ दें) और कस्टम त्रुटि जानकारी प्राप्त करें:

 >>> def bar(a, b) My Error Information Type: <type 'exceptions.SyntaxError'> Value: invalid syntax (<stdin>, line 1) Traceback: None 

sys.excepthook बारे में अधिक जानकारी के लिए: http://docs.python.org/library/sys.html#sys.excepthook

यहां एक पूर्ण छोटा उदाहरण दिया गया है जिसमें कुछ अन्य ट्रिक भी शामिल हैं:

 import sys import logging logger = logging.getLogger(__name__) handler = logging.StreamHandler(stream=sys.stdout) logger.addHandler(handler) def handle_exception(exc_type, exc_value, exc_traceback): if issubclass(exc_type, KeyboardInterrupt): sys.__excepthook__(exc_type, exc_value, exc_traceback) return logger.error("Uncaught exception", exc_info=(exc_type, exc_value, exc_traceback)) sys.excepthook = handle_exception if __name__ == "__main__": raise RuntimeError("Test unhandled") 
  • कुंजीपटल इंटरप्ट को अनदेखा करें ताकि कंसोल अजगर प्रोग्राम Ctrl + C से बाहर निकल सके।

  • अपवाद के स्वरूपण के लिए अजगर के लॉगिंग मॉड्यूल पर पूरी तरह से भरोसा रखें।

  • उदाहरण हैंडलर के साथ कस्टम लॉगर का उपयोग करें यह stderout पर जाने के बजाय stderr पर जाने के लिए अप्रतिबंधित अपवाद को बदलता है, लेकिन आप लॉगर ऑब्जेक्ट में इस प्रकार की सभी प्रकार के हैंडलर्स जोड़ सकते हैं।

अपवाद sys.excepthook होने पर विधि sys.excepthook लागू हो जाएगा: http://docs.python.org/library/sys.html#sys.excepthook

जब कोई अपवाद उठाया जाता है और अयोग्य नहीं होता है, तो इंटरप्रिटर तीन तर्कों, अपवाद वर्ग, अपवाद उदाहरण और एक ट्रैसबैक ऑब्जेक्ट के साथ sys.excepthook को कॉल करता है। एक इंटरैक्टिव सत्र में यह प्रसंस्करण को वापस करने के ठीक पहले होता है; एक पायथन प्रोग्राम में यह कार्यक्रम के बाहर निकलने से पहले होता है। ऐसे शीर्ष-स्तरीय अपवादों को संभालने के लिए अन्य तीन तर्क फ़ंक्शन को sys.excepthook पर निर्दिष्ट करके अनुकूलित किया जा सकता है।

क्यों नहीं:

 import sys import logging import traceback def log_except_hook(*exc_info): text = "".join(traceback.format_exception(*exc_info)) logging.error("Unhandled exception: %s", text) sys.excepthook = log_except_hook None() 

यहाँ पर देखा गया sys.excepthook साथ आउटपुट है:

 $ python tb.py ERROR:root:Unhandled exception: Traceback (most recent call last): File "tb.py", line 11, in <module> None() TypeError: 'NoneType' object is not callable 

यहाँ sys.excepthook साथ आउटपुट ने टिप्पणी की है:

 $ python tb.py Traceback (most recent call last): File "tb.py", line 11, in <module> None() TypeError: 'NoneType' object is not callable 

फर्क सिर्फ इतना है कि पूर्व में ERROR:root:Unhandled exception: पहली पंक्ति की शुरुआत में

Jacinda के जवाब पर निर्माण करने के लिए, लेकिन एक लॉगर ऑब्जेक्ट का उपयोग करना:

 def catchException(logger, typ, value, traceback): logger.critical("My Error Information") logger.critical("Type: %s" % typ) logger.critical("Value: %s" % value) logger.critical("Traceback: %s" % traceback) # Use a partially applied function func = lambda typ, value, traceback: catchException(logger, typ, value, traceback) sys.excepthook = func 

try...except में अपने ऐप प्रविष्टि कॉल को लपेटें try...except ब्लॉक try...except ताकि आप सभी असंकित अपवादों को पकड़ने और लॉग (और शायद पुन: उठाने) करने में सक्षम होंगे। इसके बजाय ईजी:

 if __name__ == '__main__': main() 

यह करो:

 if __name__ == '__main__': try: main() except Exception as e: logger.exception(e) raise 

शायद आप एक मॉड्यूल के शीर्ष पर कुछ कर सकते हैं जो एक फ़ाइल में stderr पुनर्निर्देशित करता है, और उसके बाद उस फ़ाइल को नीचे लॉग करें

 sock = open('error.log', 'w') sys.stderr = sock doSomething() #makes errors and they will log to error.log logging.exception(open('error.log', 'r').read() ) 

हालांकि @ gnu_lorien के उत्तर ने मुझे अच्छा प्रारंभिक बिंदु दिया, मेरा कार्यक्रम पहले अपवाद पर क्रैश करता है

मैं एक कस्टमाइज़्ड (और / या) सुधार के समाधान के साथ आया था, जो चुपचाप लॉग-इन फ़ंक्शन के अपवादों को जो @handle_error साथ सजाया गया है

 import logging __author__ = 'ahmed' logging.basicConfig(filename='error.log', level=logging.DEBUG) def handle_exception(exc_type, exc_value, exc_traceback): import sys if issubclass(exc_type, KeyboardInterrupt): sys.__excepthook__(exc_type, exc_value, exc_traceback) return logging.critical(exc_value.message, exc_info=(exc_type, exc_value, exc_traceback)) def handle_error(func): import sys def __inner(*args, **kwargs): try: return func(*args, **kwargs) except Exception, e: exc_type, exc_value, exc_tb = sys.exc_info() handle_exception(exc_type, exc_value, exc_tb) finally: print(e.message) return __inner @handle_error def main(): raise RuntimeError("RuntimeError") if __name__ == "__main__": for _ in xrange(1, 20): main()