Ich habe diesen Code auf der MSDN-Site hier Ссылка :
%Vor% Meine Frage lautet ... Die Site merkt auch an, dass .Open()
ungültigeExperationExceptions und SqlExceptions auslösen kann, aber dieses Beispiel sieht nicht so aus, als würde es sie behandeln.
Liegt das daran, dass sie sich mit dem Code beschäftigt haben, oder gibt es einen Grund, warum sie sich hier nicht behandeln lassen? Sind sie möglicherweise durch das verwendete Konstrukt irgendwie manipuliert?
Ist das nur, weil sie kurz mit dem Code waren oder da sind? Ein Grund, warum sie sich hier nicht zu behandeln lohnt? sind sie möglicherweise von handld das benutzende Konstrukt in irgendeiner Weise?
Das Schlüsselwort using
ist syntaktischer Zucker für try/finally
, und obwohl mögliche Ausnahmen nicht für den Code behandelt werden, auf den Sie verwiesen haben, wird die SQL-Verbindung ordnungsgemäß entsorgt. Sie behandeln die möglichen Ausnahmen wahrscheinlich nicht explizit, da viele es vorziehen, die Ausnahme bis zur obersten Ebene zu blubbern und die Ausnahme dort zu behandeln.
MSDN-Beispiele sind so geschrieben, dass sie ein leicht zu lesendes Beispiel bieten und keine Best Practices vermitteln. Das ist ein Grund, warum Leute Code nicht kopieren / einfügen sollten, ohne es zu verstehen.
Pro MSDN
Die using-Anweisung ruft die Dispose-Methode für das Objekt in der richtiger Weg, und (wenn Sie es wie zuvor gezeigt verwenden) verursacht es auch die Objekt selbst, um den Geltungsbereich zu verlassen, sobald Dispose aufgerufen wird.
Es schließt die offene Verbindung (durch die Verwendung von schließlich). Die ausgelöste Ausnahme wird nicht abgefangen. Dies geschieht, indem die beigefügte Anweisung in try / finally eingeschlossen wird. Es gibt keinen Haken.
Es kommt darauf an, ob Sie etwas tun können, wenn Sie diese Ausnahmen abfangen.
Wenn nicht - wird es allgemein als beste Methode angesehen, Ausnahmen den Stapel durchstoßen zu lassen, bis sie einen Punkt erreichen, an dem sie sinnvoll behandelt werden können (was vielleicht nur einen 500-Fehler protokolliert, im Falle eines Web- App)
Diese Fälle werden behandelt.
Die using
-Anweisung wird in ein ordnungsgemäßes Entsorgungsmuster übersetzt, das auch die Entsorgung im Falle von Ausnahmen behandelt.
In diesem Fall wird die Verbindung selbst dann verworfen, wenn eine Ausnahme ausgelöst wird.
Die Ausnahme selbst wird aufblühen.
Weitere Informationen finden Sie in der Verwendung der Anweisung auf MSDN.
entspricht
%Vor%"using" stellt lediglich sicher, dass die dispose () -Methode für das Objekt aufgerufen wird (in diesem Fall, um sicherzustellen, dass die Verbindung an den Verbindungspool zurückgegeben wird). "Verwenden" war nie dazu gedacht, den Fang zu ersetzen.
Bei den Projekten, an denen ich gearbeitet habe, haben wir normalerweise eine Menge Versuche. Catch wird nur auf der höchsten Ebene verwendet, um es zu protokollieren. Ein Grund, warum Catch nicht dazu verwendet werden sollte, Fehler erneut zu werfen (im Gegensatz zur Protokollierung), ist, dass Catch sehr ressourcenintensiv ist.
Dieses Beispiel ist verwirrend und technisch korrekt.
In einer realen Anwendung hat dieses Beispiel "wie es ist" keinen Wert.
Sie geben die SqlConnection nicht einmal an einen aufrufenden Code zurück.
Also "sie waren kurz mit dem Code" wie du gesagt hast.
In einem realen Szenario könnten Sie eine Methode wie diese haben
%Vor%und dann verwenden Sie es in Ihrem Code (obwohl es nicht viel zu gewinnen gibt)
%Vor%natürlich verbirgt die using-Anweisung alle Werke, um Ausnahmen zu erfassen und alles so zu schließen / zu entfernen, während technisch gesehen die Ausnahmen gehandhabt werden, in Wirklichkeit bekommt man keine Hinweise, wenn etwas fehlschlägt.
Die using-Anweisung stellt sicher, dass Dispose aufgerufen wird, auch wenn eine Ausnahme auftritt, während Sie Methoden für das Objekt aufrufen.Try / catch ist teuer. try / catch kann die Compiler-Optimierung beeinflussen und der Programmierer würde try / catch verwenden, um etwas so Einfaches wie das Prüfen auf Null zu tun. Es ist nur eine schlechte Übung. Das Abfangen einer Ausnahme ist immer langsamer als eine einfache Überprüfung. Ich sage nicht, dass ich sie benutze, aber benutze sie nicht anstelle der defensiven Programmierung.
Wenn man sich den Code anschaut, würde der "open" -Befehl nur aufgerufen werden, wenn es eine gültige Verbindung gibt ... also keine Sorge ....
"Verwenden" ist dasselbe wie das Objekt in einen try-Block zu setzen und dann Dispose in einem finally-Block aufzurufen.
Wenn Sie noch bestimmte Ausnahmen behandeln müssen, fügen Sie try..catch ..
hinzu