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

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

所以,我从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,然后允许抛出的异常通过相同的堆栈跟踪传播?

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

finally 的东西不会 运行 在没有错误的情况下。

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

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

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

不同的是finally块无论是否有异常都会执行,而catch块只有在有异常时才会执行

这样想...

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
}

A finally 运行 不管你的代码是否抛出异常,但我的理解(我可能是错的)如果你重新抛出它可能不会 运行在一个捕获中,而这个捕获又没有被处理。当无论是否发生错误都需要整理时,finally 很有用,例如处理连接。

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