Question

Sur la base de ce qui est écrit à ce sujet page web, et si je comprends bien, le using l'instruction fonctionne comme un try/finally, donc je pourrais m'attendre à tort que si une exception se produit dans un using déclaration, cela ne devrait pas faire planter le programme.

Cependant, lorsque le DownloadString La méthode, illustrée dans l'exemple ci-dessous, renvoie un WebException, le programme plante.

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

C'est normal, puisque le using l'instruction ne fonctionne pas comme un try/catch/finally, alors en réalité aucune exception n'est gérée.Mais ensuite je me demande quel est le but de using déclaration.

MISE À JOUR... Sur la base des réponses ci-dessous, j’ajoute les considérations suivantes.Fondamentalement, si je dois gérer une exception, les solutions possibles pourraient être les suivantes.

  1. Mettez le using déclaration à l'intérieur d'un try/catch bloc.
  2. Mettez seulement le DonwloadString méthode à l'intérieur d'un try/catch bloc.
  3. Écrivez manuellement un bloc try/catch/finally comme dans l'exemple de code suivant.

Exemple de code pour la troisième solution.

WebClient client = new WebClient();
try
{
    string response = client.DownloadString(url);
    // ...
}
catch(Exception ex)
{
    // handle (or ignore) the exception
}
finally
{
    if (client != null)
        client.Dispose();
}
Était-ce utile?

La solution

si je comprends bien, l'instruction using fonctionne comme un try/finally

Correct.

donc je m'attendrais à ce que si une exception se produit dans une instruction using, elle ne devrait pas planter le programme.

Incorrect.

Ni l'un ni l'autre try/finally ni using les instructions avalent les exceptions - si vous n'attrapez pas l'exception, elle se propagera.S'il n'est pas détecté, cela mettra généralement fin au processus.(Il existe quelques cas où ce ne sera pas le cas, en fonction du thread dans lequel il se trouve et de la manière dont le CLR est configuré, mais c'est une autre affaire.)

Mais ensuite je me demande quel est le but de l'instruction using.

Pour simplifier l’écriture de code nécessitant de disposer de ressources.C'est tout.Si nous n'avions pas using déclarations, nous aurions un parcelle de try/finally blocs qui viennent d'appeler Dispose...et ce serait considérablement plus laid.(J'y suis allé, j'ai fait ça - c'était Java jusqu'à ce que Java 7 introduise l'instruction try-with-resources.)

Autres conseils

UN using ne fait pas disparaître toutes les exceptions comme par magie, cela signifie simplement que le IDisposable.Dispose la méthode est correctement appelée sur le client objet si cela se produit.Ceci est important pour garantir que toutes les ressources non gérées sont libérées.

Il renverra toutes les exceptions qui se produisent et vous devrez toujours les gérer dans votre propre code.

Voir la description MSDN de using déclaration

En bref, l'utilisation garantit que .Dispose() est appelé même si une exception se produit.Cela n’empêche cependant pas l’exception de faire son travail.

L'instruction using n'a PAS de capture, seulement un enfin et dispose ainsi de la ressource pour vous.Si l'instruction using interceptait toutes les exceptions et continuait à s'exécuter, cela constituerait un obstacle majeur au débogage.

C'est tout simplement plus facile et plus rapide à utiliser et à lire

voir par vous-même

var myVar = null
try
{
    my = new Object();
    //Do stuff
}
finally
{
    if(myVar != null)
        myVar.Dispose()
}

contre

using(var myVar = new Object())
{
    //Do stuff
}

C'est simplement pour s'assurer que Disposer est appelé sur cet objet.Le en utilisant ne faites aucune gestion des exceptions comme le try/finally ne le fait pas non plus

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top