解释"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
}

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

如果您不将代码放入finally中,除非您不会得到异常,否则代码块将被执行。

但是,如果在代码块(最终没有保存在内部)将不会执行之前出现异常,则控件将从那里返回。

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

示例:1没有最终阻止

 try
    {
    //throw exption
    }
    catch
    {
    //return from here
    }
    //below statement won't get executed
    Other_Function(); 

示例:2最终阻止

  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(); 
    }

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

来自MSDN:

通常,当未处理的异常结束应用程序时,无论不是运行finally块并不重要。但是,如果您finally块中的语句,即使在这种情况下也必须运行,一种解决方案是在tryfinally语句中添加一个catch块。或者,您可以捕获可能在在调用堆栈的较高位置,tryfinally语句的try块。那个是的,您可以在调用该方法的方法中捕获异常包含try finally语句,或在调用的方法中该方法或调用堆栈中的任何方法。如果异常为如果没有捕获,finally块的执行取决于操作系统选择触发异常解除操作。

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");
    }
    }
}

相关内容

  • 没有找到相关文章

最新更新