2009-08-05 9 views

Odpowiedz

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

Chyba masz na myśli „oprócz wyjątku, e:” ... –

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

użytkowania sys.excepthook zastąpić obsługi wyjątków bazowej. Można zrobić coś takiego:

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 

Ten łapie wszystkie nieobsłużonych wyjątków, więc nie trzeba spróbować ... z wyjątkiem bloku na najwyższym poziomie kodu.

+2

buforuje on wszystkie nieobsłużonych wyjątków w głównym wątku, ale jeśli używasz modułu gwintowania, threading.Thread posiada własną try/z wyjątkiem obsługi, które omija sys.excepthook. Zobacz http://bugs.python.org/issue1230540. – metamatt

9

Masz już doskonałe odpowiedzi, po prostu chciałem dodać jeszcze jedną wskazówkę, która dobrze mi służyła przez lata w różnych językach dla konkretnego problemu "jak wyczyścić diagnozę, log, itp, out of memory błędów?". Problem polega na tym, że jeśli Twój kod uzyska kontrolę, zanim zniszczonych zostanie wystarczająco dużo obiektów, a ich pamięć zostanie ponownie przetworzona, pamięć może być zbyt ciasna, aby umożliwić rejestrowanie właściwości, pracę z Gui itp. - jak możemy się upewnić, że tak się nie stanie?

Odpowiedź: budować zapas awaryjny więc wiesz, że możesz spędzić go w takich sytuacjach kryzysowych:

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

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

Próbowałem za pomocą Neil's answer, ale to nie działa z Tkinter GUI. W tym celu musiałem 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() 
Powiązane problemy