在您的第一个示例中,您可以重新抛出异常,并且 finally 中的代码仍然会运行。这在第二个示例中是不可能的。
如果您选择不重新抛出异常,那么是的,几乎没有什么区别。但是,这被认为是错误的形式-您很少需要使用无法显式处理的异常。
它是帮助您处理代码执行流程的关键字。当您抛出异常时,代码的执行流程会受到影响(例如 using return
),该finally
关键字允许您表示当异常发生时(或者您return
来自 a try
),您仍然希望执行在它离开时执行某些操作。
要开玩笑地回答这个问题,当你需要它而不是当你不需要它时,它是必须的。
延伸阅读
为了安全起见,在您尝试开始使用此关键字之前,请阅读它的文档:
http://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx
以及一般的异常处理关键字:
http://msdn.microsoft.com/en-us/library/s7fekhdy.aspx
例子
捕获异常以对其进行处理,然后重新抛出它。用于finally
调用任何整理代码:
try
{
OpenConnectionToDatabase();
// something likely to fail
}
catch (Exception ex)
{
Log(ex);
throw;
// throw ex; // also works but behaves differently
}
// Not specifying an exception parameter also works, but you don't get exception details.
//catch (Exception)
//{
// Log("Something went wrong);
// throw;
//}
finally
{
CloseConnectionToDatabase();
}
不要注册任何对捕获异常的兴趣,而是finally
用来整理代码:
try
{
OpenConnectionToDatabase();
// something likely to fail
}
finally
{
CloseConnectionToDatabase();
}
从您的返回,try
因为它看起来格式很好,但仍用于finally
整理代码:
try
{
OpenConnectionToDatabase();
return 42;
}
finally
{
CloseConnectionToDatabase();
}