2011-01-04 14 views
6

Ich entwickle eine Django-Site und habe Probleme, herauszufinden, wie man die Ausnahmebehandlung am besten durchführt. Ich habe gemachtPython-Ausnahmebehandlung

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

Dies fängt alle Ausnahmen damit meine Website nicht 500 Fehler und dergleichen liefern. Aber mit meinem begrenzten Wissen verliere ich die tatsächliche Ausnahme und es macht es wirklich schwer zu debuggen. Wie drucke ich den aufgetretenen Fehler? Zur Zeit kommne ich dazu aus zu versuchen: catch: und sehe den Fehler und behebe ihn. Es muss einen besseren Weg geben!

Vielen Dank im Voraus

Rich-

+0

helfen, wo Sie die "nackte" 'except' Aussage wie das gesehen?Können Sie ein Zitat oder einen Link zu einem Tutorial geben, das diese Art der Programmierung zeigt? Es wird als eine schlechte Praxis angesehen. Ich möchte wissen, wo du das gelernt hast. –

+4

@ S.Lott: Anstatt auf jemanden wie diesen zu kommen, könnte es besser sein, einen alternativen Ansatz anzubieten und zu erklären, warum dies als schlechte Praxis angesehen wird. – magiconair

Antwort

1

Versuchen Sie folgendes:

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

Sie die Ausnahme in einer Ausnahmevariable fangen:

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

Es gibt verschiedene Möglichkeiten, um die Ausnahme zu formatieren , das Logging-Modul (von dem ich annehme, dass du/Django es verwendest) unterstützt das Format excep Die Ausnahmen selbst geben normalerweise nützliche Nachrichten wieder, wenn sie in Strings gerendert werden. Hier

ein Beispiel:

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) 

In diesem Beispiel wird die neue "als" Syntax, um die Ausnahme zu fangen, in Python unterstützt 2.6 und höher. Der Ausgang des oben ist:

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 

Beachten Sie, dass Sie mehrere Ausnahmen für einen Block fangen, zB:

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

Mehr auf Ausnahmebehandlung kann in diesem Tutorial zu finden:

1

Django Middleware ist, wie Sie Ausnahmen in Django-Sites verarbeiten.

Um alle Ausnahmen abzufangen, müssen Sie eine Django-Middleware erstellen und eine process_exception-Methode erstellen.

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') 

dann fügen Sie es Ihr MIDDLEWARE_CLASSES zu setzen:

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

Dann erhalten Sie Kontrolle darüber, was jede Art von Ausnahme zu tun, wenn die Begegnung.

Ich denke, das beantwortet Ihre Frage. Aber Sie sind wahrscheinlich besser dran overriding the 500.html template or the handler500 view. Beachten Sie, dass diese Ansichten erst zum Tragen kommen, wenn Sie DEBUG in den Projekteinstellungen auf False setzen.

3

kann diese

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