Точка попытки поймать, наконец, блоки? - PullRequest
3 голосов
/ 23 декабря 2010

В чем разница между окончательным использованием

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...
}

и его отключением?

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...
}

Ответы [ 4 ]

7 голосов
/ 23 декабря 2010

В первом примере будет выполняться file.Close() независимо от того, выбрасывается ли исключение или какое исключение выдается.

Последний будет работать, только если не сгенерировано исключение или System.IO.IOException.

3 голосов
/ 23 декабря 2010

Разница в том, что если вы не используете finally, и возникает исключение, отличное от IOException, ваше приложение будет пропускать дескриптор файла, потому что строка .Close никогда не будет достигнута.

Лично я всегда использую , используя блоки при работе с доступными ресурсами, такими как потоки:

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);
}

Таким образом, мне не нужно беспокоиться о том, как правильно их утилизировать. Работа try / finally выполняется компилятором, и я могу сосредоточиться на логике.

1 голос
/ 23 декабря 2010

Ваш блок catch может выдать само исключение (рассмотрим ситуацию, когда path имеет нулевую ссылку). Или исключение, выданное в блоке try, не является System.IO.IOException, поэтому оно не обрабатывается. Дескриптор файла не будет закрыт в обоих случаях, если не используется finally.

0 голосов
/ 23 декабря 2010

В твоем случае ничего.Если вы позволите исключению быть выброшенным из блока catch, то будет выполнена часть finally, но другой вариант не будет.

...