gpt4 book ai didi

c# - 最后阻止 try/catch 不起作用?

转载 作者:太空狗 更新时间:2023-10-29 22:22:33 26 4
gpt4 key购买 nike

好的,据我了解,try/catch block 尝试一个操作,catch block 捕获异常。越具体的异常越往上,就越通用到 catch block 系列的底部。在下面的代码中,我实现了 try/catch,一切正常。

据我所知,finally block 总是会执行。有些人认为 finally block 没有意义,因为无论是否有异常,最后一个 catch block 之后的代码都会被执行。

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

这就是为什么下面的代码让我感到困惑的原因。我在第一个 catch block 中抛出异常,finally block 从未执行。为什么?

*请注意,在创建 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.");
}

视频:

此代码块的问题源自此视频,在 27:20 标记处:

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

这家伙直接声明在catch block 中发生的Exception 不会阻止finally block 的执行。我看到确实如此。

最佳答案

如果这个新异常完全没有得到处理,整个过程就会被拆除,finally block 永远不会运行。

如果在更高级别有一些其他异常处理程序,或者安装了未处理的异常处理程序,finally block 运行。


此示例确实显示“关闭 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();
}

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

关于c# - 最后阻止 try/catch 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22372301/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com