【发布时间】:2014-04-17 19:32:23
【问题描述】:
好的,据我了解,try/catch 块尝试操作,catch 块捕获异常。越是特定的异常出现在顶部,越是通用的捕获块系列的底部。在下面的代码中,我实现了 try/catch,一切正常。
据我所知,finally 块总是会执行。有些人认为 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.");
}
视频:
此代码块的问题源于此视频,时间为 27:20:
https://www.youtube.com/watch?v=WxdSb3ZCWYc&list=PLAC325451207E3105&index=41
这家伙直接声明在catch块中发生的异常不会阻止finally块的执行。我看到确实如此。
【问题讨论】:
-
不要听这些人告诉你没有目的,他们很可能没有正确地做到这一点。通常还建议仅使用您可以处理的异常。如果发生未处理的异常,finally 也会运行。
-
嗯,我同意你的第一句话。但是,在这种情况下,finally 块似乎没有运行。
-
我从来没有看到“关闭 StreamReader”的文字。所以很明显在第一个catch块中抛出了一个Exception,但是finally块没有执行。
-
@PrasanthVJ 很好的链接,但最重要的选择答案(+22)似乎表明 finally 块确实运行了。我不认为是这种情况。
标签: c# oop exception exception-handling