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块执行.我看到它确实如此.
如果新的异常完全未处理,则整个过程将被拆除,并且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事件中注册未处理的异常处理程序.