8

2个条件有什么区别?每次运行method1或method2时,都应该有一个代码块需要运行。在我看来,两种方法是相同的。

// example method1
void Method1(void)
{
    try
    {
        // do something
    }
    catch (Exception ex)
    {
        // do something
    }
    finally
    {
        // do something whenever method1 runs
    }
}

// example method2
void Method2(void)
{
    try
    {
        // do something
    }
    catch (Exception ex)
    {
        // do something
    }

    // do something whenever method2 runs
}

finally 块对我来说似乎是不必要的。

4

7 回答 7

17

在您的第一个示例中,您可以重新抛出异常,并且 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();
}
于 2012-03-15T09:43:38.930 回答
3

如您所知,编写在 finally 块中的代码始终运行。请看下面写的以下几点,它将消除您的所有困惑。

  1. 最后用于资源管理。主要用于释放资源。它始终独立于异常运行。
    1. 正如我们所知,catch 用于处理异常,但有时它无法处理外部异常然后 finally 块用于处理该异常以执行操作。
于 2013-04-23T09:51:11.643 回答
2

finally 块中的代码在 try-catch 之后无论如何都会运行,这对于清理非常有用。

try
{
    // open resources
}
catch (Exception ex)
{
    // something bad happened
}
finally
{
    // close resources that are still opened
}
于 2012-03-15T09:43:32.973 回答
1

例如,这将取决于您是否return来自try. 此外 -finally即使catch抛出异常(或重新抛出原始异常)也会运行,如果没有finally.

所以:它不是必需的,但它的行为会有所不同。因此,如果您希望代码发生,请将其放在finally.

在许多方面,try/finallytry/catchtry/ catch/更常见finally

于 2012-03-15T09:44:06.847 回答
1

但是,您不一定必须拥有该finally块,拥有它可以保证其中的代码将始终运行(除非 finally 中有异常!)。

考虑以下:

void Method2(void) 
{ 
    try 
    { 
        // do something 
    } 
    catch (Exception ex) 
    { 
        // do something 
        throw;
    } 

    // do something whenever method2 runs 
} 

try/catch如果抛出异常,后面的代码将不会执行。此外,如果catch块中的代码存在导致异常的错误(例如您的日志记录引发意外异常),则本应包含在块中的代码finally将不会运行,因此保留和清理未完成。

此外,一条return语句将导致该代码不运行,而 finally 仍将被执行(此外,在这里您可以看到 catch 也可以被跳过,允许任何异常向上传播 - 在执行之后finally):

void Method2(void) 
{ 
    try 
    {  
        // do something
        return
    } 
    finally
    {     
        // do something whenever method2 runs 
    }
} 

每当您有必须在方法末尾运行的清理代码时,使用finally(或者如果您的对象实现IDisposable使用该using语句)。

于 2012-03-15T09:52:17.273 回答
0

finally 块确保其中的任何代码总是被执行,因此如果您的 try 块中有 return 语句或在 catch 块中重新抛出异常,finally 块中的代码将始终执行。

如果您需要确保无论如何都会发生某些事情(例如处置资源等),这是必须的

于 2012-03-15T09:46:15.690 回答
0

最大的区别是 try...catch 将吞下异常,隐藏发生错误的事实。try..finally 将运行您的清理代码,然后异常将继续运行,由知道如何处理它的东西处理。

于 2012-03-15T09:51:08.640 回答