因此,我从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
,然后允许抛出的异常以相同的堆栈跟踪传播?
答案 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更高