Wenn Sie rund um die SqlConnection
, SqlCommand
setzen using
Blöcke fangen und SqlDataReader
(falls zutreffend), dann, dass alles, was Sie keine explizite try/catch
müssen sicherstellen, ist entsorgt.
using(var connection = new SqlConnection(connectionString)
using(var command = new SqlCommand(procedureName, connection)
{
//etc
}
speziell auf Ihre Frage zu beantworten, über eine SqlException
oder eine Exception
fangen, die Antwort ist - ja, die SqlException
erste wenn fangen Sie etwas anders als Folge eines SqlException
gegen jede andere Ausnahme machen würde. Aber du würdest es wahrscheinlich nicht tun. Es gibt wahrscheinlich keinen Grund zu, also nein, ich würde mich nicht mit einem separaten Fang nur für die SqlException
kümmern. Tun Sie es nur, wenn Sie es brauchen.
Das lässt die Frage - müssen Sie überhaupt Ausnahmen in dieser Methode überhaupt fangen? Die Antwort ist wahrscheinlich nicht. Wenn eine Exception ausgelöst wird, wird using
über alles verfügen, was entsorgt werden muss. Irgendwann möchten Sie es protokollieren, aber Sie müssen nicht auf jeder Ebene in jeder Methode protokollieren. Wenn es sich beispielsweise um einen WCF-Dienst handelt, können Sie einfach Ausnahmen protokollieren, die beim Aufruf einer Servicemethode ausgelöst werden.
Es könnte Szenarien geben, in denen Sie die Ausnahme abfangen müssen, damit Sie etwas anders reagieren können. Vielleicht suchen Sie nach mehreren Datensätzen, und wenn einer fehlschlägt, können Sie den Fehler einfach protokollieren und ein leeres Ergebnis zurückgeben, anstatt einen Downstream-Fehler zu verursachen. Aber das ist nicht allzu oft.
Etwas anderes, das einen Blick wert ist, ist AOP - Aspect Oriented Programming. Viele Methoden benötigen die Protokollierung von Ausnahmen, aber das ist nicht wirklich die Funktion dieser Klassen. Es gibt also Möglichkeiten, den nicht verwandten, aber notwendigen Code aus den meisten Ihrer Klassen und Methoden herauszuhalten. Ich bin mit PostSharp verbunden, aber persönlich benutze ich Windsor, weil es sowohl Abhängigkeitsinjektion als auch Interzeptoren bietet, die Methodenaufrufe mit Dingen wie der Ausnahmebehandlung umhüllen.
Statt eine Verbindung explizit im 'finally' zu schließen, wird die Verbindung stattdessen in einen' using' Block gesetzt. Auch wenn du es in der Schliessung geschlossen hast, musst du es nicht im 'catch' schließen, das' finally' läuft noch, selbst wenn du zu einem 'catch' Block gehst. –