解释“终于”在try-catch-finally块中的使用

时间:2013-11-30 06:54:58

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

我读到finally键使try-catch块最后工作,甚至是函数抛出异常。但是,如果我不在finally块(如下面的Function_2)中放置代码,我想知道有什么不同,这是我用来编码的方式。谢谢!

void Function_1()
{
    try
    {
        throw new Exception();
    }
    catch
    {
    }
    finally                                   //Have finally block
    {
        Other_Function();
    }
}

void Function_2()
{
    try
    {
        throw new Exception();
    }
    catch
    {
    }

    Other_Function();                        //Don't have finally block
}

3 个答案:

答案 0 :(得分:3)

  

如果我不将代码放在finally块中(如下面的Function_2)

如果你没有把代码放在finally里面,除非你不会得到代码块将被执行的异常。

但是如果你在该代码块之前得到一个异常(最终没有保留在里面)将不会执行,因为控件从那里返回。

但如果您将代码保存在finally中,则无论情况如何都会执行。

示例:1 没有最终阻止

 try
    {
    //throw exption
    }
    catch
    {
    //return from here
    }

    //below statement won't get executed
    Other_Function(); 

示例:2 ,带有finally块

  try
    {
    //throw exption
    }
    catch
    {
    //return from here if finally block is not available 
    //if available execute finally block and return
    }
    finally
    {
    //below statement surly gets executed
    Other_Function(); 
    }

答案 1 :(得分:2)

finally块,指的是始终执行的语句块,而不管应用程序执行期间可能发生的意外事件或异常。 finally块的执行旨在释放资源,例如数据库连接,这些资源通常以有限的数量提供。

来自MSDN

  

通常,当未处理的异常结束应用程序时,无论是否   不是finally块运行并不重要。但是,如果你有   finally块中的语句,即使在那种情况下也必须运行,   一种解决方案是在try-finally语句中添加一个catch块。   或者,您可以捕获可能抛出的异常   尝试阻塞调用堆栈的try-finally语句。那   是的,您可以在调用该方法的方法中捕获异常   包含try-finally语句,或者在调用的方法中   该方法,或调用堆栈中的任何方法。如果是例外   没有抓住,执行finally块取决于是否   操作系统选择触发异常展开操作。

答案 2 :(得分:1)

始终执行finally块中的代码。最后提供了一个用于确保程序正确执行的构造。它确保在退出封闭方法之前始终达到一个语句块。 他的程序显示了finally子句如何成为程序中控制流的一部分。在该程序中,生成随机数。此值用于确定是否抛出异常,立即返回或不执行任何操作。

using System;

class Program
{
    static void Main()
    {
    try
    {
        // Acquire random integer for use in control flow.
        // ... If the number is 0, an error occurs.
        // ... If 1, the method returns.
        // ... Otherwise, fall through to end.
        int random = new Random().Next(0, 3); // 0, 1, 2
        if (random == 0)
        {
        throw new Exception("Random = 0");
        }
        if (random == 1)
        {
        Console.WriteLine("Random = 1");
        return;
        }
        Console.WriteLine("Random = 2");
    }
    finally
    {
        // This statement is executed before the Main method is exited.
        // ... It is reached when an exception is thrown.
        // ... It is reached after the return.
        // ... It is reached in other cases.
        Console.WriteLine("Control flow reaches finally");
    }
    }
}

Source