如果在try-finally的try块中发生异常,则控制流不会传递给finally块

时间:2016-10-01 08:10:45

标签: c# exception exception-handling try-catch-finally try-finally

我有以下c#代码:

   public class Program
   {
        static void Main()
        {
            int i = 123;
            string s = "Some string";
            object obj = s;

            try
            {
                // Invalid conversion; 
                i = (int)obj;

                // The following statement is not run.
                Console.WriteLine("WriteLine at the end of the try block.");
            }
            finally
            {
                Console.WriteLine("\n Finally Block executed !!!");
            }
        }
    }

当发生异常时,程序崩溃而不将控制传递给finally块,因为据了解,必须执行finally块以释放在try块中获得的资源。

1 个答案:

答案 0 :(得分:0)

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

参考:https://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx

为了验证这一点,我尝试了这样的样本并最终执行了阻止。 试试这个:

public class MainClass {
public static void Main()
{
    try {
        Invalid();
    }
    catch (Exception ext) {
        Console.Write(ext.Message);
    }
}

public static void Invalid()
{
    string message = "new string";
    object o = message;
    try
    {
        int i = (int)o;
    }
    finally
    {
        Console.WriteLine("In finally");
    }
 }
}