-3

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

我从这个问题中了解到,在 C# 中,throw可以在块中单独使用关键字(不带参数),catch以允许捕获的异常继续传播,甚至无需重置堆栈跟踪。

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

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

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

不要同时运行东西 the try stuff,然后运行finally/catch stuff​​,然后允许抛出的 Exception 使用相同的堆栈跟踪传播?

4

5 回答 5

2

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

没有错误时,finally 的东西不会运行。

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

你真的错过了这里的重点,只是catch关于处理错误(可选地分阶段)。块是关于finally资源管理的,并且仅与异常相关,因为它会在发生任何异常的情况下执行。

于 2015-04-10T18:11:28.273 回答
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
}
于 2015-04-10T18:18:19.543 回答
0

catch仅当 contenttry引发错误时finally运行,始终在tryand/or之后运行catch

于 2015-04-10T18:12:56.143 回答
0

不同之处在于,无论是否有异常,都始终执行 finally 块,而仅在有异常时才执行 catch 块

于 2015-04-10T18:13:19.673 回答
0

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

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

于 2015-04-10T18:19:55.813 回答