终于在C#中阻止了吗?

san*_*p22 6 c# finally

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

// 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
}
Run Code Online (Sandbox Code Playgroud)

最后块对我来说似乎没必要.

Ada*_*rth 16

在第一个示例中,您可以重新抛出异常,finally中的代码仍然会运行.这在第二个例子中是不可能的.

如果你选择不重新抛出异常,那么是没有什么区别.但是,这被认为是错误的形式 - 您很少需要使用无法显式处理的异常.

它是一个帮助您执行代码的关键字.当你抛出异常时,代码的执行流程会受到影响(比如使用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();
}
Run Code Online (Sandbox Code Playgroud)

不要注意捕获异常的任何兴趣,但用于finally整理代码:

try
{
    OpenConnectionToDatabase();
    // something likely to fail
}
finally
{
    CloseConnectionToDatabase();
}
Run Code Online (Sandbox Code Playgroud)

从你的返回,try因为它看起来格式很好,但仍然用于finally整理代码:

try
{
    OpenConnectionToDatabase();
    return 42;
}
finally
{
    CloseConnectionToDatabase();
}
Run Code Online (Sandbox Code Playgroud)