Frage

Auf der Grundlage dessen, was dazu geschrieben steht Website, und wenn ich das richtig verstehe, die using Anweisung funktioniert wie eine try/finally, also könnte ich fälschlicherweise erwarten, dass, wenn eine Ausnahme in a auftritt using Anweisung, es sollte das Programm nicht zum Absturz bringen.

Wenn jedoch die DownloadString Die im folgenden Beispiel gezeigte Methode löst a aus WebException, das Programm stürzt ab.

using (WebClient client = new WebClient())
{
    string response = client.DownloadString(url);
    // ...
}

Das ist normal, da die using Aussage funktioniert nicht wie a try/catch/finally, dann wird eigentlich keine Ausnahme behandelt.Aber dann frage ich mich, was der Zweck des ist using Stellungnahme.

AKTUALISIEREN... Basierend auf den Antworten unten füge ich die folgenden Überlegungen hinzu.Wenn ich eine Ausnahme behandeln muss, könnten die möglichen Lösungen grundsätzlich wie folgt aussehen.

  1. Lege das using Aussage in a try/catch Block.
  2. Setzen Sie nur die DonwloadString Methode in a try/catch Block.
  3. Schreiben Sie manuell einen try/catch/finally-Block wie im folgenden Codebeispiel.

Beispielcode für die dritte Lösung.

WebClient client = new WebClient();
try
{
    string response = client.DownloadString(url);
    // ...
}
catch(Exception ex)
{
    // handle (or ignore) the exception
}
finally
{
    if (client != null)
        client.Dispose();
}
War es hilfreich?

Lösung

Wenn ich das richtig verstehe, funktioniert die using-Anweisung wie ein try/finally

Richtig.

Daher würde ich erwarten, dass das Programm nicht zum Absturz kommt, wenn in einer using-Anweisung eine Ausnahme auftritt.

Falsch.

Weder try/finally noch using Anweisungen schlucken Ausnahmen – wenn Sie die Ausnahme nicht abfangen, wird sie weitergegeben.Wenn es nicht abgefangen wird, wird der Prozess normalerweise abgebrochen.(Es gibt einige Fälle, in denen dies nicht der Fall ist, je nachdem, in welchem ​​Thread es sich befindet und wie die CLR konfiguriert ist, aber das ist eine andere Sache.)

Aber dann frage ich mich, was der Zweck der using-Anweisung ist.

Um es einfacher zu machen, Code zu schreiben, der Ressourcen entsorgen muss.Das ist alles.Wenn wir es nicht getan hätten using Aussagen, wir hätten eine viel von try/finally Blöcke, die gerade aufgerufen haben Dispose...und das wäre wesentlich hässlicher.(Das habe ich schon gemacht – das war Java, bis Java 7 die try-with-resources-Anweisung einführte.)

Andere Tipps

A using Die Anweisung lässt nicht alle Ausnahmen auf magische Weise verschwinden, sie bedeutet nur, dass die IDisposable.Dispose Methode wird korrekt aufgerufen client Einspruch erheben, wenn einer auftritt.Dies ist wichtig, um sicherzustellen, dass alle nicht verwalteten Ressourcen freigegeben werden.

Alle auftretenden Ausnahmen werden erneut ausgelöst, und Sie müssen sie weiterhin in Ihrem eigenen Code behandeln.

Siehe MSDN-Beschreibung von using Stellungnahme

Kurz gesagt, die Verwendung gewährleistet dies .Dispose() wird auch dann aufgerufen, wenn eine Ausnahme auftritt.Es hindert die Ausnahme jedoch nicht daran, ihre Aufgabe zu erfüllen.

Die Verwendung der Anweisung hat keinen Fang, nur ein schließlich und sodass die Ressource für Sie.Wenn die Verwendung von Anweisungen alle Ausnahmen ergreift und weiter läuft, wäre es ein großes Hindernis für das Debuggen.

Es ist einfach einfacher und schneller zu verwenden und zu lesen

Sehen Sie selbst

generasacodicetagpre.

vs

generasacodicetagpre.

Es sei einfach darauf sichergestellt, dass auf diesem Objekt das entsorgen wird.Die mit tun Sie keine Ausnahmeabwicklung, da der Versuch / endgültig nicht ist, entweder

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top