2011-01-04 26 views
6

Sto sviluppando un sito Django e ho avuto problemi a cercare di trovare il modo migliore per gestire le eccezioni. Sto facendogestione delle eccezioni python

try: 
    Some code 
except: 
    log error in my own words, i.e 'Some code' failed to execute 
    Some other code 

Ciò richiama tutte le eccezioni assicurando così che il mio sito non fornisca 500 errori e simili. Ma con la mia conoscenza limitata sto perdendo l'eccezione vera e sta facendo un vero dolore al debug. Come posso stampare l'errore che si è verificato? Attualmente commento fuori provare: catch: e vedere l'errore e risolverlo. Ci deve essere un modo migliore!

Grazie in anticipo

Rich

+0

Dove hai visto la 'dichiarazione except' "nudo" del genere?Puoi fornire un preventivo o un link a un tutorial che mostri questo tipo di programmazione? È considerato una cattiva pratica. Voglio sapere dove hai imparato questo. –

+4

@ S.Lott: Invece di scendere su qualcuno del genere, potrebbe essere meglio offrire un approccio alternativo e spiegare perché è considerato una cattiva pratica. – magiconair

risposta

1

Prova questo:

try: 
    // some code 
except Exception, e: 
    // log error with data from e 
15

Si cattura l'eccezione in una variabile di eccezione:

try: 
    # some code 
except Exception, e: 
    # Log the exception. 

Ci sono vari modi per formattare l'eccezione , il modulo di registrazione (che presumo tu/Django usi) ha il supporto per formattare le eccezioni le espressioni e di solito le stesse eccezioni rendono i messaggi utili quando vengono renderizzati alle stringhe.

Ecco un esempio:

import logging 
logging.basicConfig(level=logging.DEBUG) 
logging.debug('This message should go to the log file') 

try:  
    1/0 
except Exception as e: 
    logging.exception(e) 

questo esempio viene utilizzato il nuovo "come" sintassi per intercettare l'eccezione, supportato in Python 2.6 e versioni successive. L'uscita di quanto sopra è:

DEBUG:root:This message should go to the log file 
ERROR:root:integer division or modulo by zero 
Traceback (most recent call last): 
    File "untitled-1.py", line 6, in <module> 
    1/0 
ZeroDivisionError: integer division or modulo by zero 
4
#!/usr/bin/env python 

import sys 

try: 
    0/0 
except Exception, e: 
    print >> sys.stderr, 'Hello %s' % e 
    # Hello integer division or modulo by zero 

Si noti che si può prendere più eccezioni per un isolato, ad esempio:

try: 
    open(filename) 
except NameError, e: 
    print >> sys.stderr, e 
except IOError, ioe: 
    print >> sys.stderr, ioe 

Altro su gestione delle eccezioni si possono trovare in questo tutorial:

1

Django Middleware è come si elaborano le eccezioni nei siti Django.

Per catturare tutte le eccezioni, è necessario creare un middleware Django e creare un metodo process_exception.

from django.http import HttpResponse 

class SomeMiddleware(object): 
    def process_exception(self, request, exception): 
     'Intercept exceptions' 

     return HttpResponse('Hey! an error occurred', 
       content_type='text/plain') 

poi aggiungerlo al tuo MIDDLEWARE_CLASSES impostazione:

MIDDLEWARE_CLASSES = (
    # ... 
    'some.module.SomeMiddleware', 
) 

allora si ottiene il controllo su cosa fare quando incontra alcun tipo di eccezione.

Penso che questo abbia risposto alla tua domanda. Ma probabilmente stai meglio con lo overriding the 500.html template or the handler500 view. Si noti che queste visualizzazioni non entrano in gioco finché non si imposta DEBUG su False nelle impostazioni del progetto.

3

questo può aiutare

try: 

    raise Exception('spam', 'eggs') 

except Exception as inst: 

    print type(inst)  # the exception instance 
    print inst.args  # arguments stored in .args 
    print inst   # __str__ allows args to printed directly 
    x, y = inst.args 
    print 'x =', x 
    print 'y =', y