Fang Ausnahme innerhalb Using-Anweisung
Ich weiß, dass Mit Aussage verfügt das Objekt erstellt wird. Wie, wenn ich wollte, so etwas zu tun:
Using(SqlConnection conn = new SqlConnection(connString))
{
//some code
//How to show the users if conn is not opened up or generated some kind of error?
}
Zum anzeigen der Benutzer, wenn conn nicht geöffnet oder erzeugt irgendeine Art von Fehler?
- Surround mit einem TryCatch-block.
- Mit
try/catch
. - Könnte Sie klären Ihre Frage? Ich bin mir nicht sicher, was Ihr bittet hier.
- Ich muss eine Ausnahme Benutzer mit 'Using' - Anweisung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es nichts besonderes über code innerhalb einer
using
block - verwenden Sie einfach eintry.catch
behandeln von Ausnahmen:Den
using(...) { ... }
block selbst ist so gestaltet nur, um sicherzustellen, dass die Ressource /Objekt, das es "kapselt" ist ordnungsgemäß entsorgt werden, wenn es nicht mehr gebraucht wird. Es gibt nichts, was Sie tun können, mit derusing
- Anweisung selbst zu machen, der Fehler behandelt.Also, wenn Sie erwarten, dass nur das erstellen des Objekts scheitern könnten, dann würden Sie haben, um die gesamte
using
block innerhalb dertry ... catch
block , oder fallen zurück in einetry ... catch ... finally
block und eine ordnungsgemäße Entsorgung selbst (als Adam empfahl in seiner Antwort).connection.Open()
aus einem sehr großen Teil des Codes würde ich das einbetten des try-catch-innen, die mit Deckung nur die Verbindung offen, sonst würde ich bin die mit und Schreibe alles per hand.using
bietet keine Hintertür in diecatch
.Erweitern Sie einfach manuell durchgeführt werden (kein Sinn, mit der try/catch innerhalb der mithilfe IMO):
Ich dafür über die Verpackung der
using
imtry-catch
oder einbetten einestry-catch
imusing
die meiste Zeit zu vermeiden, dass der code am Ende mit einer verschachteltentry-catch
einmal zusammengestellt. Wenn Sie nur brauchen, um zu decken eine sehr kleine Teilmenge der ein großes Stück des Codes innerhalb einerusing
aber ich würde mich mehr granulare und einbetten.using
bietet keine Unterstützung haben, haben Sie zurück zu gehen, um try/catch.using
.Ist es für den Verbraucher von der Klasse zu entscheiden, was zu tun ist, mit der Ausnahme.
Andere Antworten angegeben haben, fügen Sie einfach eine normale try/catch.
Allerdings würde ich hinzufügen, dass dies die falsch Stelle zu platzieren, try/catch, besonders wenn Ihr Ziel ist es, "zeige den Nutzern" eine Nachricht. Lassen Sie die Ausnahme geschehen auf dieser Ebene, und lassen Sie es Blase in den stack-code, der in einer besseren position zu wissen, wie Sie darauf reagieren.
In anderen Worten, lassen Sie Ihre code-Beispiel, wie es ist. Nicht etwas neues hinzufügen... Methode. Aber vielleicht ist der code, der diese Methode aufruft, sollte darüber nachdenken, wie eine Ausnahme behandeln ... eine Ausnahme... aus der Datenbank.
Nur in der üblichen Weise:
Entweder
oder
SqlConnection conn = new ...
Ist gerade die gleiche Weise, Sie würden es tun, ohne.
Machen Sie es nicht innerhalb der
using
SqlConnection
aus dem normalen Namensraum (was es wahrscheinlich auch ist), dann Stimme ich zu. Jedoch könnten einige andereSqlConnection
try\catch
existiert nur fangen einige bizarre Instanziierung Ausnahme ich dachte, die OP war zu Fragen. In dieser situationconn
wäre unbestimmt jedenfalls.Beim einbetten der using () - block in einem try/catch, die mithilfe von () - block wird in der Tat die Garantie, dass Dispose aufgerufen wird. Allerdings, wenn Sie nicht verwalteten code an einer beliebigen Stelle in Ihrem block eine exception wirft, mit() wird nur das Essen und es nicht erreichen Ihren Fang. Verwenden von try/catch innerhalb der using () - block, überspringen mit() und try/catch/finally oder verwenden Sie den sonderbaren "verwenden() versuchen," syntax mit einem catch-block (die Blätter, die Sie mit einer ungeraden Anzahl von Halterungen und wahrscheinlich verwechseln Sie das heck aus der Mitte-level-Programmierer, die später darauf stoßen.
Es ist eine gute Praxis, die Verwendung von try{}catch(){} innerhalb der using-Anweisung, wenn Sie möchten, fangen Sie eine Ausnahme, die ausgelöst durch den code innerhalb des using-Blocks. Betrachten Sie jetzt die folgenden zwei Beispiele - das erklärt, warum try-catch-block innerhalb der using-Anweisung ist eine gute Praxis.
Nun, wenn eine Ausnahme Auftritt, während der Durchführung einige Aufgaben innerhalb der using-Anweisung wird sowohl Beispiel die gleichen Ergebnisse. Die einfache Antwort ist Nein, Grund???
Wenn eine Ausnahme Auftritt, im Beispiel 1, es wird vom catch-block abgefangen - zu erreichen, ohne das Ende des using-Blocks. Daher die someObject in Beispiel 1 werden nicht entsorgt. Auch wenn die CLR ist großzügig (und das sollten Sie nicht rechnen) - der Arbeitsspeicher, der von der someObject im Beispiel 1 nicht wiederhergestellt werden (oder maximal wird es am Ende in Generation 2 GC-Sammlung).
Wo im Fall von Beispiel 2, wird der catch-block innerhalb der using-Anweisung. Das bedeutet, dass die Ausführung erreichen das Ende des using-Blocks. Daher, wird das Objekt entsorgt werden, und Sie müssen nicht sorgen zu machen über die Speicher-Leckage (Verderb,
finally
block derusing
, und die Ausnahme wird verwaltet von der äußerencatch
. Im zweiten Fall wird die Ausnahme verwaltet werden, die von der innerencatch
block, und die implizitefinally
desusing
wird, entsorgen Sie es später. So, der einzige Unterschied ist, dass in der zweiten Probecatch
das Objekt noch verfügbar ist, so können Sie immer noch verwenden es die Ausnahme behandeln. In der ersten Probe ist, wird das Objekt nicht mehr verfügbar in den catch-block. Nicht mehr Unterschiede.