使用finally而不是catch

con*_*tor 11 c# transactions try-catch try-finally

我现在已经看过这种模式了几次:

        bool success = false;
        try
        {
            DoSomething();
            success = true;
        }
        finally
        {
            if (!success)
                Rollback();
        }
Run Code Online (Sandbox Code Playgroud)

而且我一直在想:为什么这比使用catch回滚更好?

        try
        {
            DoSomething();
        }
        catch
        {
            Rollback();
            throw;
        }
Run Code Online (Sandbox Code Playgroud)

确保更改在失败时回滚的两种方法之间有什么区别?

Ser*_*rvy 0

这里的明确目标是Rollback在发生任何错误时引起调用。两个代码片段都实现了这个目标。第一个使用总是运行的finally,它验证了最后一行try成功到达块的最后一行。第二个捕获任何错误,回滚事务,然后重新抛出捕获的异常。任一片段的结果是,抛出的任何异常都将导致回滚,同时仍冒泡到下一个级别。

您提到该项目是从 Java 移植的。在 Java 中,您可以 在 C# 中一样使用throw;. 您还可以抛出一个新的异常,该异常仍将维护调用堆栈(等)。第二个在 C# 中更清晰/更简单(虽然不是很多),第一个具有实际在 Java 中工作的优点。

  • -1 表示“在 Java 中,没有办法重新抛出异常” - [除了 `throw e`,即](http://stackoverflow.com/a/1097539/265143)。 (4认同)