2017-08-27 2 views
0

In der asp.net-Anwendung kann alle Ausnahme, die auftritt und nicht in try catch sind, von application_error behandelt werden.Sollen wir versuchen fangen mit der Funktion, wenn wir nur die Ausnahme protokollieren wollen?

Wenn wir nur die Ausnahme mit ihrem Stack-Trace protokollieren müssen, und wir keine andere Entscheidung/Logik innerhalb des Catch machen müssen, warum sollten wir try catch bei application/bl oder dal layer Funktionen setzen? Gibt es einen Grund, versuchen/fangen mit jeder Datenbank-Aufruf-Funktion?

Zum Beispiel wir Hunderte von Funktion in DAL Schicht haben, die folgenden Code ausführen:

try 
{ 
    //open db connection, execute stored procedure 
} 
catch 
{ 
    //log error 
} 

Falls wir keine Ausnahme von gespeicherten Prozedur erhalten OR in Datenbank-Verbindung zu öffnen, wir eine Ausnahme erhalten, aber wir tun nicht alles außer dem Protokollieren dieser Fehler. Wir haben keine sehr kritische Datenspeicher-/Abrufanforderung. Wir protokollieren Fehler, nur um gewarnt zu werden und beheben Sie es später. Ist das richtig, um jede Funktion zu fangen?

+2

Es gibt einen Grund, "versuchen" und "fangen" unabhängig zu verwenden. Es ist nur ein grundlegender Teil der Programmierung. Also, die Antwort ist ja. –

+0

was ist der Grund? speziell, was wir nicht erreichen können, indem wir die Logging-Ausnahme bei der application_error-Funktion setzen? – maverick

+0

Lassen Sie Ihren Code nicht auf application_error zurückfallen. Jeder Fehler sollte innerhalb des Geltungsbereichs behandelt werden, aus dem er generiert wurde. Application_error ist Ihr letzter Fallback und sollte theoretisch nie erreicht werden. –

Antwort

1

Die Verwendung von try und catch dient nicht nur zum Protokollieren, insbesondere bei Datenbankverbindungen.

Eine Ausnahme bedeutet, dass etwas nicht abgeschlossen wurde. Wenn etwas nicht abgeschlossen wurde, ist Ihr Geschäftsprozess fehlgeschlagen. Wenn Ihr Geschäftsprozess fehlgeschlagen ist, müssen Sie darüber informiert sein und im Rahmen dieses Codes handeln, nicht application_error. Jeder Fehler sollte innerhalb des Geltungsbereichs behandelt werden, aus dem er generiert wurde. application_error sollte Ihr letzter Fallback sein, und theoretisch sollte nie erreicht werden.

Sicher, Sie können es für die Protokollierung verwenden, aber auch zum Schließen Ihrer DB-Verbindung (die wahrscheinlich geöffnet wurde, bevor die Ausnahme aufgetreten und für immer offen bleiben), informieren Ihre Benutzer, dass eine Ausnahme aufgetreten ist, und für die Datenwiederherstellung im Wechsel Ihr Prozess, um mit der Ausnahme fertig zu werden oder sie für eine Wiederholung vorzubereiten.

So geposteten Vorlage nehmen, sollten gute Code Handhabung wie folgt aussehen:

try 
{ 
    //open db connection, execute stored procedure 
} 
catch 
{ 
    // Inform the user 
    // Alternate your process or preparing for retry 
    // log error 
} 
finally 
{ 
    // Close the DB connection 
} 
+0

Schließen DB-Verbindung kann automatisch behandelt werden, wenn wir dapper verwenden. (https://stackoverflow.com/questions/40824948/closing-connection-when-using-dapper). Wenn wir keine Anforderung haben, die Anfrage erneut zu versuchen, sollte die Protokollierung nicht auf einer gemeinsamen Ebene erfolgen? – maverick

+0

@MAVERICK Es basiert auf der Meinung, aber meiner Meinung nach, die Verwendung von "allgemeinen" Fehlerbehandlung wie, wie Sie "common level" nennen, ist eine schlechte Praxis. Nochmals - jeder Fehler hat eine Bedeutung, es gibt keinen allgemeinen Fehler. Jede fehlerhafte DB-Ausführung hat ihre Konsequenzen und sollte in ihrem Umfang berücksichtigt werden. –

1

Man sollte try/catch-Blöcke nur an Orten, wo Sie eine Ausnahme sinnvoll umgehen kann. "Sinnvolle Handhabung" schließt jedoch das Bereitstellen von guten Fehlermeldungen ein.

Wenn Ihr catch-Block einfach die Ausnahme ohne zusätzlichen Kontext protokolliert, dann könnte ein solcher Block durch einen Top-Level-Handler (wie application_error) ersetzt werden, der dasselbe tut.

Wenn Sie jedoch zusätzliche Informationen nur zum Zeitpunkt des Aufrufs protokollieren, dann ist die Verwendung eines catch-Blocks völlig gerechtfertigt: Sie verbessert die Erfahrung durch eine bessere Diagnose, was ein absolut legitimes Ziel ist.

+0

Was ist Top-Level-Handler, Application_error? – maverick

+1

@ Maverick richtig. – dasblinkenlight

Verwandte Themen