web-dev-qa-db-fra.com

C # "en utilisant" syntaxe

Est-ce que l'utilisation de l'utilisation de l'exception ou de le lancer? c'est à dire.

using (StreamReader rdr = File.OpenText("file.txt"))
{
 //do stuff
}

Si le StreamReader jette une exception est-il capturé par l'utilisation ou la projection de la fonction d'appel peut le gérer?

45
Gordon Thompson

utiliser des déclarations ne mangez pas d'exceptions.

Tout "Utilisation" est la portée de votre objet à l'utilisation du bloc et les appels automatiquement jettent () sur l'objet lorsqu'il quitte le bloc.

Il y a cependant un gotcha, si un fil est avorté avec force par une source extérieure, il est possible que le dispositif ne soit jamais appelé.

31
FlySwat

using Permet à l'exception de faire bouillir. Il agit comme un essai/enfin, où le dispositif est finalement utilisé. Ainsi, il n'est approprié que/utile pour les objets qui implémentent IDisposable.

16
Chris Marasti-Georg

Cela jette l'exception, donc votre méthode contenant doit le gérer ou transmettre la pile.

try
{
    using (
        StreamReader rdr = File.OpenText("file.txt"))
    { //do stuff 
    }
}
catch (FileNotFoundException Ex)
{
    // The file didn't exist
}
catch (AccessViolationException Ex)
{
    // You don't have the permission to open this
}
catch (Exception Ex)
{
    // Something happened! 
}
5
stephenbayer

Dans votre exemple, si File.OpenText lancers, le Dispose sera non être appelé.

Si l'exception arrive dans //do stuff, le Disposevolonté être appelé.

Dans les deux cas, l'exception est normalement propagée hors de la portée, comme elle serait sans le en utilisant .

3

L'utilisation n'interfère pas avec la manipulation des exceptions en dehors du nettoyage des choses dans sa portée.

Cela ne gère pas les exceptions mais permet de passer des exceptions.

2
tpower

using garanties * L'objet créé sera disposé à la fin du bloc, même si une exception est lancée. L'exception est non capturée. Cependant, vous devez faire attention à ce que vous faites si vous essayez de l'attraper vous-même. Étant donné que tout code qui attire l'exception est en dehors du bloc d'étendue défini par la déclaration using, votre objet ne sera pas disponible pour ce code.

* En empêchant les suspects habituels comme une panne de courant, l'holocauste nucléaire, etc.

2
Joel Coehoorn

Vous pouvez imaginer en utilisant comme un essayez ... enfin bloc sans le bloc de capture. Dans le bloc enfin, Idisposable.Dispose est appelé, et comme il n'y a pas de bloc d'attraction, aucune exception est projetée de la pile.

1
petr k.

"Utiliser" ne pas attraper des exceptions, il suffit de disposer de ressources en cas d'exceptions non gérées.

Peut-être la question est-elle, serait-elle disposer des ressources allouées entre parenthèses si une erreur s'est également produite dans la déclaration? Il est difficile d'imaginer que cela se passe, cependant.

0
harpo