例外与否?如果"是" - 检查与否?

kar*_*rla 1 language-agnostic oop exception-handling

我认为这涉及到一个广泛的主题,但是当一切都以最佳方式完成时,除了理想的变体之外,处理程序工作流程的最佳方法是什么.

让我们更具体一点:

一个类有一个方法,该方法对其参数进行操作并返回结果.例如:

public Map<Object,OurObject> doTheWork(OtherObject oo);
Run Code Online (Sandbox Code Playgroud)

我排除的一个可能的结果是,null如果有其他方式,但理想的回归.

处理这种情况有正确的方法("银弹",或所谓的"最佳实践")吗?

我看到其他三个结果:

1 - 该方法返回EMPTY_MAP;

2 - 该方法检查了异常;

3 - 抛出RuntimeException;

如果对该问题没有一般正确答案 - 应该考虑哪些条件?

关于设计的合同原则(简单地说,该方法的责任是照顾输出,假设输入参数是正确的) - 是正确的方法来抛出任何异常或最好是空车返回的结果,但正确在结构中(例如,不为null)

Nat*_*hes 7

返回null就像为某人设置陷阱.(在像HashMaps这样的情况下,我们已经过训练以寻找空值,因此可以选择先例.)用户必须知道要注意空值,并且他们必须编写一个替代路径来处理这种情况(这听起来很像处理异常),或者冒着NPE的风险(在这种情况下,异常会被抛出,只是信息量较少,距离原始问题发生地点的距离,所以有关出错的信息将是失踪).

返回一张空地图会让人不清楚是否有任何问题.像返回null一样没有伤害,但它完全是模棱两可的.如果以某种方式返回地图数据纯粹是一种尽力而为的事情而且用户并不需要知道,这可能没问题.(但这非常罕见.)

如果您希望用户能够处理异常,则抛出已检查的异常可能是合适的.

如果用户无法对异常执行任何操作,或者由于编程错误或由于测试期间应该捕获的内容而发生异常,则可以使用未经检查的异常进行参数化.关于应该检查什么以及应该取消选择什么,存在很大的分歧空间.