try-finally和try-catch-throw有什么区别?

时间:2015-04-10 18:10:11

标签: c# exception-handling try-catch try-finally

因此,我从this question了解到,即使发生异常, finally 块也可用于执行代码,即使异常未被捕获并允许传播

我从this question了解到,在C#中, throw 关键字可以单独使用(没有参数) catch 阻止允许捕获的异常继续传播,甚至不重置堆栈跟踪。

那么,我的问题是这两个块之间的区别是什么:

/* example 1 */
try { /* try stuff */ }
finally { /* finally/catch stuff */ }

/* example 2 */
try { /* try stuff */ }
catch { /* finally/catch stuff */ throw; }

不要运行try stuff的东西,然后运行finally/catch stuff,然后允许抛出的异常以相同的堆栈跟踪传播?

5 个答案:

答案 0 :(得分:2)

try { /* try stuff */ }
catch { /* finally/catch stuff */ throw; }

当没有错误时,最终的东西不会运行。

finally{}块用于清理,您的建议会浪费宝贵的资源。

你真的错过了这一点,只有catch是关于处理错误(可选择分阶段)。 finally块是关于资源管理的,并且只与异常相关,即使发生了任何异常,它也会执行。

答案 1 :(得分:1)

想想这样......

try
{
    //do some stuff
}
catch
{
    //do some stuff if there was an exception
    //maybe some cleanup, maybe rethrow exception
}
finally
{
    //always do this stuff exception or not
}

答案 2 :(得分:0)

catch仅在try的内容引发错误时运行,finally始终在try和/或catch之后运行。

答案 3 :(得分:0)

不同之处在于,如果您有异常,则始终执行finally块,而只有在您有异常时才执行catch块

答案 4 :(得分:0)

无论你的代码是否抛出异常,终于会运行,但是我理解(我可能错了)如果你重新抛出一个反过来没有处理的catch,它可能无法运行。无论是否发生错误(例如处置连接),最终都需要整理。

第二个示例只会在catch中运行代码,或者代码不会抛出异常。在这种情况下,我会删除try catch并让它冒泡并让try catch更高