我读到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");
}
}
}
源