【问题标题】:Control flow is not passing over to finally block if exception occurs in try block of try-finally如果 try-finally 的 try 块中发生异常,控制流不会传递到 finally 块
【发布时间】:2016-10-01 08:10:44
【问题描述】:

我有以下 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 块中获得的资源。

【问题讨论】:

  • this fiddle 可以看出,这不是真的。提供一个 minimal reproducible example 来证明您的问题。
  • 是的,它可以在 dotnetfiddle 上运行,但是当我在 Visual Studio 2013 上运行它时,它会抛出以下异常,而没有通过控制来最终阻止,就像你的情况一样。未处理的异常:System.InvalidCastException:指定的转换无效。在 c:\Users\Kifayat\Desktop\Learn\excepti onHandling\exceptionHandling\Program.cs:line 69 中的 exceptionHandling.Program.Main() 处
  • 它仍然会执行它。您可能会看到 Visual Studio 在未处理的异常上中断,这将在 finally 块执行之前。再次点击“运行”,finally 块将执行。

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


【解决方案1】:

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

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

为了验证这一点,我像这样尝试了您的示例,它执行了 finally 块。 试试这个:

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

【讨论】:

  • 不需要“解决方案”。 finally 块将总是被执行。
猜你喜欢
  • 2014-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 2013-02-23
  • 1970-01-01
  • 2017-07-20
  • 1970-01-01
  • 2012-09-20
相关资源
最近更新 更多