2010-01-18 67 views
7

我应该在try中放置多个语句,然后捕获所有可能的异常,或者我应该只在try语句中放置一条语句吗?try/catch语句中有多少条语句?

例子:

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

或者

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

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

return true; 
+1

无论如何,使用布尔返回成功或失败的方法是错误的错误处理方法。如果您需要捕捉此方法中的错误以执行某些操作,请执行此操作并再次重新抛出该异常以采用更高级的方法。 – 2010-01-18 15:20:26

回答

7

包装您的关键部件,以保持您的信息清晰并符合要求。

+0

我同意,这里没有单一的解决方案,因为它需要一个个案。有时你的第一个例子会变得更有意义,有时候会是第二个例子。 – cjstehno 2010-01-18 14:53:43

+0

+1。根据你正在尝试做的事情对它进行分组。如果第一组语句存在读取文件,则将它们组合在一起(因为一个部分失败,其余部分无关紧要)。如果这些陈述是做了两件独立的事情(第二件不依赖于第一件),那么随意分割它们。 – JasCav 2010-01-18 15:14:54

3

你把更多的语句,更一般的关于异常的原因可以是潜在的。

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

在你的例子中,你似乎有非重叠的例外,所以你的第一个表单是好的。

0

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

0

根据jldupont的说法,我总是试图将潜在风险声明分成多个try/catch块。这样,当出现问题时,您知道刚好是,您可以知道每个问题的具体错误消息。

0

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

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

0

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

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

1

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

0

首选,它可以让更多的理解和可读的代码,更使您的过程或函数应该尝试做一个非常具体的行动,事实上,你有2个单独的呼叫可能抛出2个独立的异常是指其做的比预想的要多,也许这是必要的

要么将​​2个调用分成两个独立的方法,要么采用第一种方法。

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

0

我宁愿在try块中使用多个语句,然后捕获所有可能的异常。不知道为什么,但我总是这样做,而编码

0

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

但是,如果有可能为MaybeThrowIOException()抛出FooBarException,或MaybeThrowFooBarException()抛出IOException,那么你应该只包装他们,如果你一起想他们两个在一个例外,采取同样的行动!

3

这要看情况,但要注意的是,在第一种情况下MaybeThrowFooBarException()被nerver称为如果MaybeThrowIOException()抛出一个异常,并在第二种情况下MaybeThrowFooBarException将八方通称为除非例外是很重要在第一次捕获中重新生成

2

我认为最佳实践是书中The Pragmatic Programmer中详述的最佳实践,应该很少使用异常 - 但是在使用时应该清除它应该处理的内容。

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

+1

它是这么说的?我所能找到的只是:“我们认为例外应该很少用作程序正常流程的一部分;异常应该保留用于意外事件。” – Sjoerd 2010-01-18 17:03:26

0

如果您正在调用的方法可以返回FooExeption()和BarException(),并且您希望同时捕获这两个方法,那么第一个示例最有意义 - 不少API都会这样做,特别是更高级别的他们自己正在使用更多可能引发异常的事情)。

如果你正在做的两回事那就真的完全取决于你想要什么样的结果是:

  • 如果任一一个例外,最终达到同样的事情,至于你的代码关注,并且你不关心是否需要回滚任何东西(或者从任何一个回滚都很简单,而且你可以在一个finally块中轻松完成 - 假设语言支持这个),那么没有必要在两个单独的try /抓块。

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

  • 如果你关心第一个方法是否失败,如果它不想继续执行,那么值得记住的是你可以嵌套try/catch,尽管最好不要过度使用它。如果使用得当,它比试图在if语句中跟踪bools来检查块是否应该执行要明显得多。

例如

try { 

    MaybeThrowFooException(); 

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

    } catch (BarException ex) { 

    } 

} catch (FooException ex) { 

}