2016-08-09 154 views
0

Grundsätzlich mein Ziel am besten durch Beispiel descriped ist:Django Exception-Handler für den Standard-brench in try-except Block

Ansicht

define test_view() 
    try 
     # some code block 
    except error_type_1: 
     status = 428 
     # do something 
    except error_type_2: 
     # do something else 
    except # any other mistake 
     # print the error to console 
    finally 
     return smth 

Meine Frage ist, gibt es einen Standard-Block in Python try-except, damit ich die benutzerdefinierte Fehlermeldung, dass Django auf die Konsole drucken kann, wenn eine Ausnahme in der Ansicht vorhanden ist, greifen kann? Soweit ich weiß, ist else Block dafür nicht vorgesehen. Das Grundprinzip hinter dieser Frage ist, dass nachdem ich meinen Code mit try-except-Block umgeben habe, es schwer wird zu verstehen, was in dem Code in den Fällen vor sich geht, in denen der Fehler nicht aufgrund dessen, was ich erwartet hatte, stieg.

+1

Es klingt, als ob Sie einen try-Block um einen ganzen Codebereich verwenden, anstatt ihn zu verwenden, um bestimmte Fehler zu erkennen. – Sayse

+0

Ja, genau. Ist es eine schlechte Übung? –

+0

Ich nehme an das ist meine Meinung. Ich würde sagen, aus genau dem Grund, warum Sie diese Frage überhaupt gestellt haben, machen Sie Ihren Code unnötig lang. Anstatt sich auf den beabsichtigten Programmfluss zu konzentrieren, metzelst du ihn, um ihn zum Arbeiten zu zwingen. – Sayse

Antwort

1

Durch die Verwendung einer return Anweisung im finally Block verbergen Sie den Fehler effektiv. Normalerweise wird jede nicht abgefangene Ausnahme nach dem finally-Block erneut ausgelöst, aber die return-Anweisung gibt die Steuerung von der Funktion zurück, bevor dies passieren kann. Es ist besser, die return-Anweisung aus dem finally Block und lassen Sie die unerwarteten Fehler propagieren natürlich bewegen:

def test_view(): 
    try 
     # some code block 
    except error_type_1: 
     status = 428 
     # do something 
    except error_type_2: 
     # do something else 

    return smth 

Sie alle Ausnahmen mit einem bloßen außer Klausel fangen oder durch Exception fangen, obwohl dies oft nicht zu empfehlen, da es können die Details leicht verstecken erforderlich, um das Problem zu debuggen:

try: 
    do_something() 
except: 
    handle_exception() 

try: 
    do_something() 
except Exception as exc: 
    handle_exception(exc) 

Wenn eine view-Funktion eine Ausnahme auslöst, Django wird dies für Sie tun, und Sie eine detaillierte Fehlerseite geben, die die Fehlermeldung enthält, Traceback, lokale Variablen und mehr.