2016-05-07 3 views
0

Ich habe mir selbst C# beigebracht und im Moment entwickle ich einen try catch-Block. Es ist in eine Datenbank zu schreiben.C# Die beste Methode, um von einer Datenbankabfrage abzuweichen

try 
    { 
     //Write to Database 
    } 
    catch (SqlException ex) 
    { 
     //report issue 
     //close connection 
    } 
    catch (Exception ex) 
    { 
     //report issue 
     //close connection 
    } 
    finally 
    { 
     //close connection 
    } 

Gibt es eine andere Ausnahme, die überprüft werden sollte?

Sollte ich auch prüfen, ob die Verbindung String fehlschlägt?

Oder wäre die SQLException alleine gut genug?

+0

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. –

Antwort

2

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.

0

Exception-Klasse ist eine grneric Klasse und es werden alle Ausnahmen

Verwandte Themen