我读到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
}
答案 0 :(得分:3)
如果我不将代码放在finally块中(如下面的Function_2)
如果你没有把代码放在finally
里面,除非你不会得到代码块将被执行的异常。
但是如果你在该代码块之前得到一个异常(最终没有保留在里面)将不会执行,因为控件从那里返回。
但如果您将代码保存在finally
中,则无论情况如何都会执行。
示例:1 没有最终阻止
try
{
//throw exption
}
catch
{
//return from here
}
//below statement won't get executed
Other_Function();
示例:2 ,带有finally块
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();
}
答案 1 :(得分:2)
finally块,指的是始终执行的语句块,而不管应用程序执行期间可能发生的意外事件或异常。 finally块的执行旨在释放资源,例如数据库连接,这些资源通常以有限的数量提供。
来自MSDN:
通常,当未处理的异常结束应用程序时,无论是否 不是finally块运行并不重要。但是,如果你有 finally块中的语句,即使在那种情况下也必须运行, 一种解决方案是在try-finally语句中添加一个catch块。 或者,您可以捕获可能抛出的异常 尝试阻塞调用堆栈的try-finally语句。那 是的,您可以在调用该方法的方法中捕获异常 包含try-finally语句,或者在调用的方法中 该方法,或调用堆栈中的任何方法。如果是例外 没有抓住,执行finally块取决于是否 操作系统选择触发异常展开操作。
答案 2 :(得分:1)
始终执行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");
}
}
}