2010-01-12 43 views
1

比方说,你有一个功能(X),它只需要一个对象并对它做一些工作。它可以以某种方式失败:处理集合时应如何处理异常?

function X(obj) throws SomeException 

而且我有这些对象的集合,并希望运行所有这些X。所以我换行了其自身的功能:

function Y(objs) 
    foreach obj in objs 
    X(obj) 
    end 
end 

什么是处理通过X返回的例外情况的最好方法?

一个明显的选择是根本不捕获异常,导致集合的处理在第一次失败时停止。

另一种方法是捕捉每个发生的异常并将其保存在一边。最后,如果有任何异常,你可以抛出一个新的异常。您可以选择将这些异常作为新异常的嵌套异常。

另一个办法是完全忽略了的异常,像这标志着成功/失败,甚至返回发生异常的数组的布尔数组返回的东西。

回答

1

它很大程度上取决于你正在做的事情。

如果每个项目都必须处理,那么打破第一个例外可能是最好的选择。

如果您提交了一堆已从第三方来源解析过的项目,并且您预计某些失败会记录失败的项目并返回状态对象,那么很可能就要走了。

1

我认为你列出的所有三个都是有效的,哪一个你选择取决于具体使用情况 - 也就是说,这是最适合你的应用程序。 “最佳实践”不能超越应用逻辑,写得很好的实践并不能规定逻辑。

1

没有一个正确的答案。

所有你说的是一个选项。你什么都不做,让它传播。您可以捕获并立即重新抛出更多有关在发生异常时处理哪个对象的信息,这会更好。您可以在最后捕获并抛出一个异常,可选地包含所有内部异常。你也可以捕获并记录异常,而不是重新抛出。

我时常使用所有这些技术。这实际上取决于您的应用程序特定的功能和您的业务需求。

1

这完全取决于完成后列表的状态。

如果某些项目无法正确处理是可以接受的,则要么吞下他们,要么返回指示成功/失败的布尔值。

如果要求所有项目都正确处理,我会有的例外

您可能希望避免创建例外列表,您可能更希望事先检查项目并返回不符合所需状态的项目列表。

1

答案完全取决于你和你的对象做什么,和它发生的背景。

如果它的好,并不是所有被处理,那么显然你不希望发生故障的硬盘,并终止执行 - 允许调用代码访问异常的详细信息可能会有所帮助,也可能不是。

如果处理所有数据都很重要,那么您会返回一些说明失败的值,或者如果操作对程序状态至关重要,则会让异常进一步向上。

1

这是一个非常滑的斜坡,你正在骑。处理异常需要程序将程序的状态恢复到抛出异常之前的状态,以便继续执行。这将是很难做到的,收集显然包含一个无法处理的对象。恢复状态也需要恢复集合。

也许这是可能的。但不是在代码片段中,它没有任何代码似乎负责在集合中输入对象。如果您不知道如何恢复状态,则不应该发现异常。

1

嗯,我想是相当多的相同,但它是一个没有正确或错误的答案,只是更正确或worg某些特定情况下。
捕获并继续重新抛出异常对机器来说可能相当昂贵,但它可能是您想要的行为。
我可以给出两个指针:
- 如果你打算放弃收集过程,如果一个错误只是捕获异常,并做任何你可能会觉得它的样子;
- 如果你想断言某个项目是写还是错,断言所有,你应该捕获它们,如果你觉得它,只要记录它或放弃它,或保存所有这些'内部异常',并rethrow或在流程结束时对待他们。

究竟是什么情况?