尝试抓点终于阻止?

时间:2010-12-23 14:27:41

标签: c# try-catch try-catch-finally

使用finally

之间有什么区别
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 个答案:

答案 0 :(得分:7)

前一个示例将运行file.Close(),无论是抛出异常还是抛出异常。

后者仅在未抛出异常或抛出System.IO.IOException时才会运行。

答案 1 :(得分:3)

不同之处在于,如果您不使用finally并且抛出IOException以外的异常,则您的应用程序将泄漏文件句柄,因为永远不会到达.Close

在处理诸如流的可支配资源时,我个人总是使用using块:

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内容由编译器处理,我可以专注于逻辑。

答案 2 :(得分:1)

您的catch块本身可能会抛出异常(考虑path为null-reference时的情况)。或者try块中抛出的异常不是System.IO.IOException,因此不会处理。除非使用finally,否则在两种情况下都不会关闭文件句柄。

答案 3 :(得分:0)

在你的情况下,没有。如果你让异常被抛出catch块,那么finally部分就会运行,但另一个变种不会。