try / catch语句中有多少个语句?

时间:2010-01-18 14:49:02

标签: exception exception-handling oop try-catch

我应该在try中放入多个语句然后捕获所有可能的异常,还是应该只在try语句中放入一个语句?

示例:

try {
    MaybeThrowIOException();
    MaybeThrowFooBarException();
    return true;
} catch (IOException e) {
    // ...
} catch (FooBarException e) {
   // ... 
}

或者

try {
    MaybeThrowIOException();
} catch (IOException e) {
    // ...
}

try {
    MaybeThrowFooBarException();
} catch (FooBarException e) {
   // ... 
}

return true;

13 个答案:

答案 0 :(得分:7)

包裹您的关键部分,让您的信息清晰明确。

答案 1 :(得分:3)

您提出的陈述越多,您可能潜在的异常原因就越不具体。

但当然,这取决于函数调用/语句是否带有重叠异常,即如果所有异常都能以特定方式计算,那么它仍然可以。

在您的示例中,您似乎有非重叠的异常,因此您的第一个表单没问题。

答案 2 :(得分:3)

这取决于具体情况,但重要的是要注意,在第一种情况下,如果MaybeThrowIOException()抛出异常,那么MaybeThrowFooBarException()是神经调用,而在第二种情况下,将全部调用MaybeThrowFooBarException 除非在第一次捕获中重新抛出异常

答案 3 :(得分:2)

我认为最佳做法是书The Pragmatic Programmer中详述的那个,很少使用例外 - 但是在使用它时应该清楚它应该处理的是什么。

所以,我的投票是例子#2。

答案 4 :(得分:1)

您可以通过单个try / catch循环处理多种类型的异常。但要注意处理异常的顺序。捕获异常块的顺序很重要。

答案 5 :(得分:0)

我认为你的第一个例子比第二个更好。

答案 6 :(得分:0)

根据jldupont的说法,我总是尝试将我的潜在风险陈述分成多个try / catch块。这样当出现问题时,你知道确切地它在哪里,你可以为每个问题都有特定的错误信息。

答案 7 :(得分:0)

你可以使用它们中的任何一个。

但是如果使用第一个,那么你应该捕获更具体的例外。

答案 8 :(得分:0)

通常,您可以将要执行的操作与特定任务分开。将与该任务相关的代码放入一个try catch中,然后如果出现问题,您就知道该任务已失败,您可以尝试从那里恢复。

我发现这种方法减少了你需要编写的catch代码的数量,并将相关逻辑保持在一起。

答案 9 :(得分:0)

第一个选择,它允许更易理解和可读的代码,更多的是你的程序或功能应该尝试做一个非常具体的操作,你有2个单独的调用,可能会抛出2单独的例外意味着它做的比它应该做的更多,也许这是必要的

将2个调用吐入2个单独的方法或者采用第一种方法。

您可能想要使用第二种方法的唯一原因是,如果您的方法执行2个操作并且稍微多一点,但您只想处理2行异常代码,并且可能包装它们并继续执行但是这样不建议

答案 10 :(得分:0)

我更喜欢在try块中使用多个语句,然后捕获所有可能的异常。不确定为什么,但我总是在编码时这样做

答案 11 :(得分:0)

如果他们真的像这样分开,那么第一种是更好的做法,只因为它更短。

但是,如果MaybeThrowIOException()可能会抛出FooBarException,或MaybeThrowFooBarException()抛出IOException,那么只要你想要它们就可以将它们包起来两者都在异常时采取相同的行动!

答案 12 :(得分:0)

如果您正在调用的方法可以返回FooExeption()和BarException(),并且您想要捕获两者,那么第一个示例最有意义 - 相当多的API执行此操作,尤其是更高级别的API(因为它们他们自己正在使用更多可以引发异常的事情。)

如果你正在做两件事,那么它真的完全取决于你想要的结果:

  • 如果一个例外中的任何一个最终都与你的代码相同,并且你不关心滚动任何东西(或者很容易从任何一个回滚,你很容易做到它在一个finally块中 - 假设语言支持这个),那么有两个单独的try / catch块是没有意义的。

  • 如果错误类型非常多变并且您关心如果第一种方法引发异常(例如并且需要执行某些操作以回滚)并且您想继续执行第二次操作会发生什么,即使第一种方法抛出异常,然后第二种方法更合适。

  • 如果您关心第一种方法是否失败并且您不想继续执行它,那么值得记住您可以嵌套try / catch,尽管最好不要过度使用它。如果使用得好,它比在if语句中跟踪bool以检查块是否应该执行要清楚得多。

e.g。

try {

    MaybeThrowFooException();

    try {
    // Will only be called as long as MaybeThrowFooException() is not thrown
        MaybeThrowBarException();

    } catch (BarException ex) {

    }

} catch (FooException ex) {

}