最后在try/catch中阻塞不起作用?

use*_*043 5 c# oop exception-handling exception

好吧,据我所知,try/catch块尝试操作并捕获块捕获异常.更具体的异常排在最前面,对于一系列catch块的底部越通用.在下面的代码中,我实现了try/catch,一切正常.

据我所知,finally块始终执行.有些人认为最终阻止是没有目的的,因为如果有异常或者没有异常,那么最后一个catch块之后的代码无论如何都会被执行.

但是,反对这一点的论点是,如果在catch块中抛出异常,则没有后续的catch块来捕获该异常.因此,通过将资源清理代码放在finally块中,可以确保在catch块中抛出异常时释放资源.

这就是为什么以下代码让我困惑的原因.我在第一个catch块中抛出异常,finally块永远不会执行.为什么?

*请注意,创建myStreamReader时确实会抛出异常,因为该文件实际上称为generic.txt,并且有目的拼写错误,以便抛出初始异常.

StreamReader myStreamReader = null;

try
{
   myStreamReader = new StreamReader("c:\\genneric.txt");   
   Console.WriteLine(myStreadReader.ReadToEnd());       
}

catch(FileNotFoundException Error)
{
   Console.WriteLine(Error.Message);
   Console.WriteLine(); 
   throw new Exception();
}

catch(Exception Error)
{
   Console.WriteLine(Error.Message);
   Console.WriteLine();
}

finally
{

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

  Console.WriteLine("Closed the StreamReader.");
}
Run Code Online (Sandbox Code Playgroud)

视频:

这段代码的问题源于此视频,时间为27:20:

https://www.youtube.com/watch?v=WxdSb3ZCWYc&list=PLAC325451207E3105&index=41

该人直接声明在catch块中发生的异常不会阻止finally块执行.我看到它确实如此.

Dam*_*ver 7

如果新的异常完全未处理,则整个过程将被拆除,并且finally块永远不会运行.

如果有在更高层次上一些其他的异常处理程序,或者未处理的异常处理程序已经安装完毕,该finally运行.


此示例显示"Closed the StreamReader":

    static void Main()
    {
        try
        {
            StreamReader myStreamReader = null;

            try
            {
                myStreamReader = new StreamReader("c:\\genneric.txt");
                Console.WriteLine(myStreamReader.ReadToEnd());
            }

            catch (FileNotFoundException Error)
            {
                Console.WriteLine(Error.Message);
                Console.WriteLine();
                throw new Exception();
            }

            catch (Exception Error)
            {
                Console.WriteLine(Error.Message);
                Console.WriteLine();
            }

            finally
            {

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

                Console.WriteLine("Closed the StreamReader.");
            }
        }
        catch
        {

        }
        Console.WriteLine("Done");
        Console.ReadLine();
    }
Run Code Online (Sandbox Code Playgroud)

可以在AppDomain.UnhandledException事件中注册未处理的异常处理程序.