处理集合时应如何处理异常?

时间:2010-01-12 17:03:08

标签: exception collections

假设您有一个函数(X),它接受一个对象并使用它做一些工作。它可能以某种方式失败:

function X(obj) throws SomeException

我有这些对象的集合,并希望在所有这些对象上运行X。所以我把它包装在自己的函数中:

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

处理X返回的异常的最佳方法是什么?

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

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

另一种方法是完全忽略异常,返回类似于标记成功/失败的布尔数组,甚至返回发生的异常数组。

7 个答案:

答案 0 :(得分:1)

我认为您列出的所有三个都是有效的,您选择哪一个取决于具体的用例 - 也就是说,哪个最适合您的应用程序。 “最佳实践”不能胜过应用程序逻辑,而良好的编写实践并不能决定逻辑。

答案 1 :(得分:1)

没有一个正确答案。

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

我不时使用所有这些技巧。这实际上取决于您的应用程序具体做什么以及您的业务需求。

答案 2 :(得分:1)

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

如果某些项目无法正确处理是可以接受的,那么吞下它们或返回一个表示成功/失败的布尔值。

如果要求所有项目都正确处理,我会发现冒泡例外。

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

答案 3 :(得分:1)

答案完全取决于您对对象的处理方式以及对象的上下文。

如果没有处理完所有问题,那么显然你不想失败并终止执行 - 允许调用代码访问异常细节可能会有所帮助,或者可能不是。

如果处理所有内容很重要,那么您会返回一些值,表示失败,或者如果操作对程序状态至关重要,则让异常气泡进一步增加。

答案 4 :(得分:1)

这在很大程度上取决于你所做的事情。

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

如果您要提交一堆已经从第三方来源解析的项目,并且您希望记录失败的项目并返回状态对象可能会有一些失败。

答案 5 :(得分:1)

这是一个非常滑的斜坡。处理异常需要程序将程序状态恢复到抛出异常之前的状态,以便继续有意义。这将是非常难以做到的,该集合显然包含一个无法处理的对象。恢复状态也需要恢复集合。

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

答案 6 :(得分:1)

嗯,我想这是相同的,但它没有正确或错误的答案,只是对某些特定情况更正确或worg。
捕获和继续重新抛出异常对于机器而言可能相当昂贵,但它可能是您想要的行为 我可以给出两点建议:
- 如果您打算丢弃收集过程,如果错误,只需捕获异常并做任何您想要的事情;
- 如果你想断言某个项是写还是错,断言全部,你应该全部捕获它们,如果你想要它,或者只是记录它或丢弃它,或保存所有那些“内部异常”并重新抛出或处理这些都在过程结束时
究竟是什么情况?