如果在 try-finally 的 try 块中发生异常,则控制流不会传递到 finally 块
Control flow is not passing over to finally block if exception occurs in try block of 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 块中获得的资源。
通常,当一个未处理的异常结束一个应用程序时,finally块是否运行并不重要。但是,如果 finally 块中的语句即使在那种情况下也必须是 运行,一种解决方案是向 try-finally 语句添加一个 catch 块。或者,您可以捕获调用堆栈上层 try-finally 语句的 try 块中可能抛出的异常。也就是说,您可以在调用包含 try-finally 语句的方法的方法中捕获异常,或者在调用该方法的方法中捕获异常,或者在调用堆栈中的任何方法中捕获异常。如果没有捕获到异常,finally块的执行取决于操作系统是否选择触发异常unwind操作。
参考: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");
}
}
}
我有以下 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 块中获得的资源。
通常,当一个未处理的异常结束一个应用程序时,finally块是否运行并不重要。但是,如果 finally 块中的语句即使在那种情况下也必须是 运行,一种解决方案是向 try-finally 语句添加一个 catch 块。或者,您可以捕获调用堆栈上层 try-finally 语句的 try 块中可能抛出的异常。也就是说,您可以在调用包含 try-finally 语句的方法的方法中捕获异常,或者在调用该方法的方法中捕获异常,或者在调用堆栈中的任何方法中捕获异常。如果没有捕获到异常,finally块的执行取决于操作系统是否选择触发异常unwind操作。
参考: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");
}
}
}