异常处理?

Exception handling?

我有以下代码。

using System;
using System.IO;                          

class ExceptionHandling
{
    public static void Main()
    {   
        StreamReader streamReader = null;   
        try
        {
        streamReader = new StreamReader("C:\Sample Files\Data.txt");      
        Console.WriteLine(streamReader.ReadToEnd());                              
        }

        catch(FileNotFoundException ex)                                         
        {       
            Console.WriteLine("Please check if the file {0} exists",ex.FileName); 
        }
        catch(Exception ex) 
        {
            Console.WriteLine(ex.Message);
        }
        finally
        {   
            if (streamReader !=null)                
            {
            streamReader.Close();
            }
            Console.WriteLine("FInally Block");   
        }
    }
}

我的问题如下:

1) 在StreamReader streamReader = null;中为什么streamReader被赋值为null?

2) streamReader = new StreamReader 我只是想澄清一下。 streamReader 引用变量是否指向 StreamReader 对象?

3) 如果streamReader = new StreamReader("C:\Sample Files\Data.txt");出现异常,streamReader是否还能打开?

4) 因为我们写了 StreamReader streamReader = null; streamReader 不是总是空的,因此不可能在 Finally 块中关闭吗?

5)我不确定 FileNotFoundException exException ex 是如何工作的。不是 ex 对象引用变量吗,它不是只有在我们将它们分配给 Exception ex = new Exception 这样的对象后才有效吗?

  1. 这只是将 streamReader 变量初始化为 null。如果你没有初始化这个值,你会得到关于在 fianally 块中使用未初始化变量的编译器错误。

  2. 是。

  3. 没有。但是 StreamReader 构造函数有可能会成功,但对 streamReader.ReadToEnd() 的调用将抛出异常。在这种情况下,您将有一个开放的 streamReader.

  4. 没有,看上面的回答

  5. 不同的 catch 块允许您处理不同类型的错误。只有一个 catch 块将处理任何给定的异常。 C# 将找出您处理的最具体的异常并确保您进入该块。异常的实际实例 (ex) 将由框架构建并传递给块。您不需要做任何明确的事情。

  1. 这条语句意味着稍后如果你想检查streamReader是否正确打开你可以做streamReader == null

  2. 这从路径中实例化了 streamReader 对象的新实例。

  3. 否 streamReader 不会打开并抛出异常

  4. 在 finally 块中,这将是 运行 如果发生异常,如果没有发生也是如此。因此,处理任何已分配的系统资源很重要。

  5. FileNotFound 在打开 streamReader 时抛出,但是异常 ex 是任何其他异常的一般情况。

关于 streamReader 的一些一般信息它是一个 class 继承自 System.IO.Stream 对象(具有类似的属性)。它在实例化时分配系统资源,并声明自己正在读取某个流(在本例中为文件流)。因此,如果您实例化一个 streamReader,您需要关闭它,以便其他应用程序可以访问该资源。

它阻止其他应用程序读取该资源的原因是为了防止发生多线程问题,即一个应用程序读取文档,程序员假设文档在他们的程序打开文档和他们打开文档之间是不变的关闭它。如果出现另一个程序并更改文件中的某些文本,则原始程序可能会崩溃并导致 BSOD。