2010-12-13 14 views
1

Was ist der beste Weg, Ausnahmen zu behandeln. SoUmgang mit Ausnahmen in Python

class SRException(Exception): 
    default_exception = True 

    def somefun1(email): 
     try: 
      user = somefun2(email) 
     except Exception, e: 
      raise SRException, ("could not find the email", e) 

    def somefun2(email): 
     try: 
      user = User.objects.get(email = email) 
     except Exception, e: 
      raise SRException, ("could not find the user objecets",e) 

wenn Ausnahme geschieht ich eine lange Liste von Ausnahme erhalten

UserProfileException (‚nicht der Benutzer oder Dienstobjekte finden konnten‘, UserProfileException (‚nicht der Benutzer finden konnten‘, ServicesException ('konnte nicht finden den Service', doesNotExist ('Dienstleistungen passende Abfrage existiert nicht.',))))))))

Fehler und obige Codebeispiele sind nicht identisch. Aber ich denke, ich habe meinen Standpunkt deutlich gemacht.

Also, was ist der beste Weg, Ausnahmen zu behandeln. Sollte ich es nicht in allen Ausnahmen erhöhen. Und ich sende immer dann Mail an das technische Team, wenn Ausnahmen auftreten.

+0

Erstens, was möchten Sie tun? Dein Code macht keinen Sinn, deshalb solltest du uns ein Ziel geben, damit wir das Problem verstehen können. –

Antwort

2

Es ist normalerweise nicht notwendig, Ausnahmen auf jeder Ebene des Aufruf-Stacks zu umbrechen. Es ist besser, wenn Sie irgendwo weit oben im Call-Stack Ausnahmen abfangen und einen Stack-Trace in die Tech-Support-E-Mail schreiben. Dies zeigt deutlich, wo das Problem aufgetreten ist und wo es aufgerufen wurde.

Mit ein wenig Graben in sys.exc_info()[2], könnten Sie sogar eine vollständige Liste von Parametern und Locals in jedem Stack-Frame, die Support-Mitarbeiter die anstößige E-Mail-Adresse geben würde.

+0

Hey danke. Können Sie mir bitte einen Link oder ein Blog zum Umgang mit sys.exc_info() [2] bereitstellen? – laspal

4

Ihr Ausnahmebehandler ist zu breit, fangen Sie nur die spezifischen Ausnahmen, von denen Sie wissen, dass Sie mit umgehen können. Es hat keinen Sinn eine Exception zu fangen, nur um sie in eine andere Exception zu packen und sie erneut zu erhöhen; Ein Ausnahmeobjekt enthält einen Traceback, der Ihnen anzeigt, welchen Pfad der Code einschlägt. Lassen Sie die Exception einfach aufblühen und fangen Sie sie auf einer Ebene ab, auf der Sie die Exception wiederherstellen können.

1

Zunächst einmal nie nur nach Exception suchen! Verwenden Sie immer den richtigen Subtyp, den Sie tatsächlich erwarten.

Auch sollten Sie nicht bereits nützliche Ausnahmen in andere einkapseln; und verwende im Allgemeinen den Typ der Ausnahme als eine Identifikation dessen, was passiert. Dann können Sie einfach (informative) Ausnahmen auf niedriger Ebene werfen und sie alle getrennt auf einer höheren Ebene abfangen, um die richtige Fehlermeldung für den Endbenutzer zu ermitteln.

+0

In Python "erheben" wir Ausnahmen; wir werfen sie nicht ;-) –

+0

@Chris Morgan: Ja, ich weiß, aber es ist immer noch das Gleiche: P Abgesehen davon gilt diese Antwort für alle Sprachen, die sowieso Ausnahmen haben. – poke

Verwandte Themen