Welcher:
using (var myObject = new MyClass())
{
try
{
// something here...
}
catch(Exception ex)
{
// Handle exception
}
}
ODER
try
{
using (var myObject = new MyClass())
{
// something here...
}
}
catch(Exception ex)
{
// Handle exception
}
c#
try-catch
using-statement
Xaqron
quelle
quelle
}
Teil derusing
Anweisung eine Ausnahme auslösen kann, wie hier erinnert .finally
Methode dispose aufgerufen wird.Antworten:
Ich bevorzuge den zweiten. Kann auch Fehler in Bezug auf die Erstellung des Objekts einfangen.
quelle
try
Block, mit dem Sie eine Fehlermeldung anzeigen können, wenn etwas fehlschlägt, kann das Programm den Benutzer jetzt wiederherstellen und informieren.using( DBConnection conn = DBFactory.getConnection())
die im Falle einer aufgetretenen Ausnahme zurückgesetzt werden müsste. Mir scheint, dass beide ihren Platz haben.Da ein using-Block nur eine Syntaxvereinfachung eines try / finally ( MSDN ) ist, würde ich persönlich Folgendes tun, obwohl ich bezweifle, dass er sich erheblich von Ihrer zweiten Option unterscheidet:
quelle
finally
Blocks Ihrer Meinung nach derusing
Anweisung vorzuziehen ?finally
Eineusing
Anweisung fügt einen Block hinzu, der ein IDisposable-Objekt bereitstellt . Persönlich mag ich dies anstelle des eingebettetenusing
Blocks, weil ich denke, dass es sauberer angibt, wo alles passiert und dass alles auf der gleichen "Ebene" ist. Ich mag das auch mehr als mehrere eingebetteteusing
Blöcke ... aber es ist alles nur meine Präferenz.try
Anweisung instanziiert werden , damit es innerhalb derfinally
Anweisung angeordnet werden kann. Andernfalls wird ein Compilerfehler ausgegeben: "Verwendung der nicht zugewiesenen lokalen Variablen 'myObject'"Cannot assign null to implicitly-typed local variable
;) Aber ich weiß was du meinst und würde dies persönlich dem Verschachteln eines using-Blocks vorziehen.Es hängt davon ab, ob. Wenn Sie Windows Communication Foundation (WCF) verwenden,
using(...) { try... }
funktioniert dies nicht ordnungsgemäß, wenn sich der Proxy in derusing
Anweisung im Ausnahmestatus befindet. Das Entsorgen dieses Proxys führt zu einer weiteren Ausnahme.Persönlich glaube ich an einen minimalen Handhabungsansatz, dh nur an eine Ausnahme, die Ihnen zum Zeitpunkt der Ausführung bekannt ist. Mit anderen Worten, wenn Sie wissen, dass die Initialisierung einer Variablen in
using
eine bestimmte Ausnahme auslösen kann, schließe ich sie mit eintry-catch
. In ähnlicher Weise, wenn innerhalb desusing
Körpers etwas passieren kann, das nicht direkt mit der Variablen in zusammenhängtusing
, dann verpacke ich estry
für diese bestimmte Ausnahme mit einem anderen . Ich benutze seltenException
in meinencatch
es.Aber ich mag
IDisposable
undusing
obwohl ich vielleicht voreingenommen bin.quelle
Wenn Ihre catch-Anweisung auf die in einer using-Anweisung deklarierte Variable zugreifen muss, ist inside Ihre einzige Option.
Wenn Ihre catch-Anweisung das Objekt benötigt, auf das in der Verwendung verwiesen wird, bevor es entsorgt wird, ist inside Ihre einzige Option.
Wenn Ihre catch-Anweisung eine Aktion von unbekannter Dauer ausführt, z. B. das Anzeigen einer Nachricht an den Benutzer, und Sie Ihre Ressourcen vorher entsorgen möchten, ist außerhalb Ihre beste Option.
Immer wenn ich ein ähnliches Szenario habe, befindet sich der Try-Catch-Block normalerweise in einer anderen Methode weiter oben im Aufrufstapel als die Verwendung. Es ist nicht typisch für eine Methode, zu wissen, wie mit Ausnahmen umgegangen wird, die in dieser Methode auftreten.
Meine allgemeine Empfehlung ist also draußen - weit draußen.
quelle
Beide sind gültige Syntax. Es kommt wirklich darauf an, was Sie tun möchten: Wenn Sie Fehler beim Erstellen / Entsorgen des Objekts feststellen möchten, verwenden Sie die zweite. Wenn nicht, verwenden Sie die erste.
quelle
Es ist eine wichtige Sache , die ich hier aus anrufen würde: Die erste wird nicht jede Ausnahme fängt die sich aus aufrufen
MyClass
Konstruktor.quelle
Ab C # 8.0 bevorzuge ich die zweite
und dann
quelle
Wenn das Objekt, das Sie im Block Using () initialisieren, möglicherweise eine Ausnahme auslöst, sollten Sie die zweite Syntax verwenden, andernfalls sind beide gleichermaßen gültig.
In meinem Szenario musste ich eine Datei öffnen und habe filePath im Konstruktor des Objekts übergeben, das ich im Using () -Block initialisiert habe, und es kann eine Ausnahme auslösen, wenn der filePath falsch / leer ist. In diesem Fall ist die zweite Syntax also sinnvoll.
Mein Beispielcode: -
quelle
Ab C # 8.0 können Sie vereinfachen
using
Anweisungen unter bestimmten Bedingungen , um den verschachtelten Block zu entfernen. Dies gilt dann nur für den umschließenden Block.So können Ihre beiden Beispiele reduziert werden auf:
Und:
Beide sind ziemlich klar; Dies reduziert die Auswahl zwischen beiden auf die Frage, wie der Umfang des Objekts aussehen soll, wo Instanziierungsfehler behandelt werden sollen und wann Sie es entsorgen möchten.
quelle