finally块是否毫无意义?

时间:2016-04-21 18:46:41

标签: c# .net try-catch-finally

我正在自学C#,我正在研究尝试,捕获并最终。我正在使用的书正在讨论finally块是如何运行的,无论try块是否成功。但是,即使最终没有,也不会运行在catch块之外编写的代码?如果是这样,终于有什么意义呢?这是本书提供的示例程序:

class myAppClass
{
    public static void Main()
    {
        int[] myArray = new int[5];

        try
        {
            for (int ctr = 0; ctr <10; ctr++)
            {
                myArray[ctr] = ctr;
            }
        }
        catch
        {
            Console.WriteLine("Exception caught");
        }
        finally
        {
            Console.WriteLine("Done with exception handling");
        }
        Console.WriteLine("End of Program");
        Console.ReadLine();            
    }
}

5 个答案:

答案 0 :(得分:4)

这些是finally有用的场景:

try
{
    //Do something
}
catch (Exception e)
{
    //Try to recover from exception

    //But if you can't
    throw e;
}
finally
{
    //clean up
}

通常您尝试从异常中恢复或处理某些类型的异常,但是如果您无法恢复,则不会捕获特定类型的异常,而是向调用者抛出异常,但是finally块被执行反正。

另一种情况是:

try
{
    //Do something
    return result;
}
finally
{
    //clean up
}

如果您的代码运行正常并且没有抛出异常,您可以从try块返回并释放finally块中的所有资源。

在这两种情况下,如果您将代码置于try之外,则永远不会执行。

答案 1 :(得分:1)

finally块执行在任何一种情况下都需要运行的代码。例如,您经常重新抛出异常或以其他方式转到其他代码。如果资源的清理代码不在finally块中,则不会执行。您也可以将此代码放在catch块中,但无论如何您都会在try块之后重复代码。

答案 2 :(得分:0)

finally块非常有用,因为它允许您进行资源清理,否则如果您遇到异常则不会发生。

e.g。 (伪)

try {
    open socket
    use socket
} 
// note: no catch for any socket exceptions
finally {
    delete socket  // always executed
}

答案 3 :(得分:0)

finally块的重点是包装你开始的东西。假设你在try块中打开了一个缓冲区,你应该在finally中关闭它。这是必要的,这样即使发生异常并且您从try中退出,资源也会正确关闭。

try
{
    //Do Something
}
catch
{
    //Catch Something
}
finally
{
    //Always Do This
}
  

很多时候,catch语句中的代码会重新抛出异常或者中断当前函数。如果你没有最终阻止,&#34;总是这样做&#34;如果catch语句中的代码发出一个返回或抛出一个新的异常,则调用不会执行。

答案 4 :(得分:0)

这是一个简单的例子,显示写在catch块之外的代码无论如何都不会运行,即使它最终还没有!

URLClassLoader loader = new URLClassLoader(new URL[]{new URL("jar:file:/home/myapp/plugins/dateplugin.jar!/")}, ClassLoader.getSystemClassLoader());
MyInterface pluginClass = (MyInterface )loader.loadClass("com.mypackage.MyClass").newinstance();

,输出

  

最后
  钓到

请阅读MSDN