2010-12-23 1 views
3

Quelle est la différence entre l'utilisation finalementPoint d'essai attraper enfin des blocs?

void ReadFile(int index) 
{ 
    // To run this code, substitute a valid path from your local machine 
    string path = @"c:\users\public\test.txt"; 
    System.IO.StreamReader file = new System.IO.StreamReader(path); 
    char[] buffer = new char[10]; 
    try 
    { 
     file.ReadBlock(buffer, index, buffer.Length); 
    } 
    catch (System.IO.IOException e) 
    { 
     Console.WriteLine("Error reading from {0}. 
      Message = {1}", path, e.Message); 
    } 
    finally 
    { 
     if (file != null) 
     { 
      file.Close(); 
     } 
    } 
    // Do something with buffer... 
} 

et ne pas l'utiliser?

void ReadFile(int index) 
{ 
    // To run this code, substitute a valid path from your local machine 
    string path = @"c:\users\public\test.txt"; 
    System.IO.StreamReader file = new System.IO.StreamReader(path); 
    char[] buffer = new char[10]; 
    try 
    { 
     file.ReadBlock(buffer, index, buffer.Length); 
    } 
    catch (System.IO.IOException e) 
    { 
     Console.WriteLine("Error reading from {0}. 
      Message = {1}", path, e.Message); 
    } 

    if (file != null) 
    { 
     file.Close(); 
    } 

    // Do something with buffer... 
} 
+3

Le bloc catch peut renvoyer l'erreur, en déclencher un nouveau, etc., qui contournera la fermeture de finally. Voir ici - http://stackoverflow.com/questions/50618/what-is-the-point-of-the-finally-block – StuartLC

+0

Je sais que quelqu'un d'autre va taper une réponse plus vite que je peux, mais avez-vous considéré causer un IOException et voir la différence par vous-même? – ChaosPandion

Répondre

7

Le premier exemple exécutera file.Close(), qu'une exception soit levée ou qu'une exception soit levée.

Ce dernier ne s'exécutera que si aucune exception n'est levée ou si un System.IO.IOException est levé.

+0

c'est ce que je cherchais :) merci! – bevacqua

+0

Prendre soin d'accepter? ;) –

+0

ouais je ne pouvais pas alors, n'était pas pour le moment. – bevacqua

3

La différence est que si vous n'utilisez pas finally et une exception autre que IOException est jeté votre application fuie un descripteur de fichier parce que la ligne .Close ne sera jamais atteint.

Personnellement, j'utiliser toujours using blocs lorsque les ressources à usage unique comme les ruisseaux:

try 
{ 
    using (var reader = File.OpenText(@"c:\users\public\test.txt")) 
    { 
     char[] buffer = new char[10]; 
     reader.ReadBlock(buffer, index, buffer.Length); 
     // Do something with buffer... 
    } 
} 
catch (IOException ex) 
{ 
    Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message); 
} 

De cette façon, je n'ai pas à vous soucier de les disposer correctement. Le truc try/finally est géré par le compilateur et je peux me concentrer sur la logique.

+0

ouais je viens de copier et coller un exemple, que se passe-t-il si je ne spécifie pas uniquement des IOExceptions? – bevacqua

0

Dans votre cas, rien. Si vous laissez l'exception être expulsée du bloc de capture, la partie finale s'exécutera, mais pas l'autre variante.

1

Votre bloc catch peut lancer une exception lui-même (considérez la situation où path est null-reference). Ou l'exception levée dans le bloc try n'est pas System.IO.IOException, elle n'est donc pas gérée. La poignée de fichier ne sera pas fermée dans les deux cas sauf si finally est utilisé.