46 votes

C# À L'Aide De La Syntaxe

L'attraper à l'aide de l'exception ou de le jeter? c'est à dire

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

Si le streamreader déclenche une exception est-il pris en utilisant ou en jeté de sorte que la fonction d'appel peut s'en occuper?

62voto

jop Points 31978

Quand vous voyez une instruction d'utilisation, pensez à ce code:

StreadReader rdr = null;
try
{
    rdr = File.OpenText("file.txt");
    //do stuff
}
finally
{
    if (rdr != null)
        rdr.Dispose();
}

Donc, la réponse est qu'il ne veut pas faire n'importe quoi avec l'exception levée dans le corps de l'utilisation de bloc. Il n'a pas de poignée ou de le renvoyer il.

32voto

FlySwat Points 61945

à l'aide de relevés ne mangent pas des exceptions.

Tous les "Aide" n'est à la portée de votre objet à l'aide du bloc, et appelle automatiquement dispose() sur l'objet au moment où il quitte le bloc.

Il y a un piège, si un thread est violemment interrompue par une source extérieure, il est possible que d'en Disposer ne sera jamais appelé.

16voto

Chris Marasti-Georg Points 17023

using permet à l'exception d'ébullition à travers. Il agit comme un try/finally, où le dispose enfin de l'objet utilisé. Ainsi, il est seulement approprié et utile pour les objets qui implémentent IDisposable.

5voto

stephenbayer Points 5548

Il lève l'exception, donc, soit votre contenant de la méthode doit le gérer, ou passer en haut de 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! 
}

3voto

Jeffrey L Whitledge Points 27574

Toutes les exceptions qui sont jetés dans l'expression d'initialisation de l'instruction à l'aide de propagation jusqu'à la portée de la méthode et de la pile d'appel comme prévu.

Une chose à surveiller, bien que, est que si une exception se fait dans l'expression d'initialisation, puis la méthode dispose() ne sera pas appelée sur l'expression variable. C'est presque toujours le comportement que vous voulez, puisque vous ne voulez pas vous embêter à supprimer un objet qui n'a pas été effectivement créé. Toutefois, il pourrait y avoir un problème dans des circonstances complexes. C'est, si plusieurs initialisations sont enterrés à l'intérieur, le constructeur et certains réussissent avant de l'exception levée, puis la Disposer appel peut ne pas se produire à ce point. Ce n'est généralement pas un problème, même si, depuis, les constructeurs sont généralement simples.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X