关于c#:try-finally和try-catch-throw有什么区别?

What is the difference between try-finally and try-catch-throw?

因此,我从这个问题了解到,即使发生异常,即使异常未被捕获并允许向上传播,也可以使用finally块来执行代码。

我从这个问题了解到,在c中,throw关键字可以在catch块中单独使用(没有参数),以允许捕获的异常继续传播,而不必重置堆栈跟踪。

那么,我的问题是,这两个街区有什么区别:

1
2
3
4
5
6
7
/* example 1 */
try { /* try stuff */ }
finally { /* finally/catch stuff */ }

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

不要同时运行try stuff,然后运行finally/catch stuff,然后允许抛出的异常用相同的堆栈跟踪来支持它?


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

当没有错误的时候,最后的东西就不会运行了。

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

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


像这样想…

1
2
3
4
5
6
7
8
9
10
11
12
13
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
}


不管您的代码是否引发异常,finally都将运行,但我的理解是(我可能是错的),如果您重新抛出一个未处理的catch,它可能不会运行。当您需要整理时,不管是否发生错误(如处理连接),最后一个都很有用。

第二个示例将只在catch中运行代码,或者如果代码不引发异常。在这种情况下,我会去掉试捕获,让它冒泡,让试捕获更高。


不同的是,无论是否有异常,最终块都始终被执行,而catch块只在有异常时执行。


只有当try的内容出错时,catch才运行,finally总是在try和/或catch之后运行。