哪里最后是必要的?

Tra*_*y13 10 c# exception finally

我知道如何使用try-catch-finally.但是我没有得到使用的进展,finally因为我总是可以在try-catch块之后放置代码.有没有明确的例子?

Dan*_*Tao 2

更新:这实际上不是一个很好的答案。另一方面,也许这一个很好的答案,因为它说明了一个成功的完美示例finally,而开发人员(即我)可能无法确保正确清理。在下面的代码中,考虑抛出异常以外的情况。SpecificException那么第一个示例仍然会执行清理,而第二个示例则不会,即使开发人员可能认为“我捕获了异常并处理了它,所以后续代码肯定会运行”。

\n\n
\n\n

每个人都给出了使用try/finally 而不使用catch. 这样做仍然有意义catch即使您抛出异常,考虑您想要返回值的情况*。

\n\n
try\n{\n    DoSomethingTricky();\n    return true;\n}\ncatch (SpecificException ex)\n{\n    LogException(ex);\n    return false;\n}\nfinally\n{\n    DoImportantCleanup();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

上面的替代方案没有finally的替代方案(在我看来)可读性稍差:

\n\n
bool success;\n\ntry\n{\n    DoSomethingTricky();\n    success = true;\n}\ncatch (SpecificException ex)\n{\n    LogException(ex);\n    success = false;\n}\n\nDoImportantCleanup();\nreturn success;\n
Run Code Online (Sandbox Code Playgroud)\n\n

*我确实认为//更好的例子是在块中重新抛出异常(使用,而不是\ xe2\x80\x94 但那是另一个主题),因此是必要的,因为在/不会运行。这通常是通过对资源的语句来完成的,但情况并非总是如此。有时清理并不是专门的调用(或者不仅仅是调用)。trycatchfinallythrow throw excatchfinallytrycatchusingIDisposableDisposeDispose

\n