2009-08-05 9 views
6

आम तौर पर अनचाहे अपवाद stdout (या stderr?) पर जाते हैं, मैं एक ऐप बना रहा हूं जहां मैं इसे बंद करने से पहले GUI को यह जानकारी पास करना चाहता हूं और इसे उपयोगकर्ता को प्रदर्शित करना चाहता हूं, साथ ही साथ मैं इसे लिखना चाहता हूं एक लॉग फ़ाइल के लिए। तो, मुझे अपवाद के पूर्ण पाठ के साथ एक str की जरूरत है।पायथन: वैकल्पिक तरीके से मैं किसी भी अनचाहे अपवाद को कैसे संभाल सकता हूं?

मैं यह कैसे कर सकता हूं?

उत्तर

0
try: 
    # blah blah The Main Loop, function, whatever... 
except e: 
    do_something_with(str(e)) 
+4

मुझे लगता है कि आप मतलब है "को छोड़कर अपवाद, ई:" ... –

2
import sys, logging 

logging.basicConfig(filename='/path/to/log/file', filemode='w')  
... 

try: 
    your_code_here() 
except: 
    logging.exception("My code failed") # logs exception to file 
    # you define display_exception_in_ui as "def display_exception_in_ui(exc, tb):" 
    display_exception_in_ui(*sys.exc_info()[1:]) # passes exception instance, traceback 
15

उपयोग आधार अपवाद संचालक को बदलने के लिए sys.excepthook। आप की तरह कुछ कर सकते हैं:

import sys 
from PyQt4 import QtGui 

import os.path 
import traceback 

def handle_exception(exc_type, exc_value, exc_traceback): 
    """ handle all exceptions """ 

    ## KeyboardInterrupt is a special case. 
    ## We don't raise the error dialog when it occurs. 
    if issubclass(exc_type, KeyboardInterrupt): 
    if QtGui.qApp: 
     QtGui.qApp.quit() 
    return 

    filename, line, dummy, dummy = traceback.extract_tb(exc_traceback).pop() 
    filename = os.path.basename(filename) 
    error = "%s: %s" % (exc_type.__name__, exc_value) 

    QtGui.QMessageBox.critical(None,"Error", 
    "<html>A critical error has occured.<br/> " 
    + "<b>%s</b><br/><br/>" % error 
    + "It occurred at <b>line %d</b> of file <b>%s</b>.<br/>" % (line, filename) 
    + "</html>") 

    print "Closed due to an error. This is the full error report:" 
    print 
    print "".join(traceback.format_exception(exc_type, exc_value, exc_traceback)) 
    sys.exit(1) 



# install handler for exceptions 
sys.excepthook = handle_exception 

यह सब बिना क्रिया अपवाद पकड़ता है, तो आप एक अपने कोड के शीर्ष स्तर पर ब्लॉक को छोड़कर कोशिश ... जरूरत नहीं है।

+2

यह मुख्य थ्रेड में सभी बिना क्रिया अपवाद कैश, लेकिन अगर आप सूत्रण मॉड्यूल का उपयोग, threading.Thread अपनी ही कोशिश है/हैंडलर को छोड़कर जो sys.excepthook circumvents। Http://bugs.python.org/issue1230540 देखें। – metamatt

9

आपको पहले से ही उत्कृष्ट उत्तर मिल गए हैं, मैं सिर्फ एक और टिप जोड़ना चाहता हूं जिसने मुझे "समस्या का निदान, लॉग, आदि, out of memory त्रुटियों को कैसे ठीक करें" के लिए विभिन्न भाषाओं में अच्छी तरह से सेवा दी है। समस्या यह है कि, यदि पर्याप्त वस्तुओं को नष्ट कर दिया गया है और उनकी स्मृति पुनर्नवीनीकरण से पहले आपका कोड नियंत्रण प्राप्त हो जाता है, तो स्मृति लॉगिंग, गुई काम आदि इत्यादि करने के लिए मेमोरी बहुत तंग हो सकती है - हम कैसे सुनिश्चित करते हैं कि ऐसा नहीं होता है?

उत्तर: एक आपातकालीन गुप्त कोष का निर्माण तो आप जानते हैं कि आप इस तरह के आपात स्थिति में खर्च कर सकते हैं:

rainydayfund = [[] for x in xrange(16*1024)] # or however much you need 

def handle_exception(e): 
    global rainydayfund 
    del rainydayfund 
    ... etc, etc ... 
0

मैं Neil's answer उपयोग करने की कोशिश, लेकिन यह एक Tkinter जीयूआई के साथ काम नहीं करता। इसके लिए, मुझे override report_callback_exception() था।

import Tkinter as tk 
import tkMessageBox 
import traceback 

class MyApp(tk.Frame): 
    def __init__(self, parent, *args, **kwargs): 
     tk.Frame.__init__(self, parent, *args, **kwargs) 
     parent.report_callback_exception = self.report_callback_exception 
     self.parent = parent 
     self.button_frame = tk.Frame(self) 
     self.button_frame.pack(side='top') 
     self.button_run = tk.Button(
      self.button_frame, text="Run", command=self.run 
     ) 
     self.button_run.grid(row=0, column=1, sticky='W') 

    def run(self): 
     tkMessageBox.showinfo('Info', 'The process is running.') 
     raise RuntimeError('Tripped.') 

    def report_callback_exception(self, exc_type, exc_value, exc_traceback): 
     message = ''.join(traceback.format_exception(exc_type, 
                exc_value, 
                exc_traceback)) 
     tkMessageBox.showerror('Error', message) 

def main(): 
    root = tk.Tk() # parent widget 

    MyApp(root).pack(fill='both', expand=True) 

    root.mainloop() # enter Tk event loop 

if __name__ == '__main__': 
    main() 
संबंधित मुद्दे