java - 空结果与可预测但不可预防的失败引发异常
问题描述
对于遇到可预测但无法预防的故障的方法,首选设计是什么?他们应该返回空结果还是在失败时抛出异常?请解释你的理由。
我将给出两个示例方法:
- 类似Arrays.binarySearch()的方法返回数组中值的索引。
Tickets.buy(20, 100)
. 票务机器人尝试使用 100 美元购买至少 20 张票。该方法返回已购买的门票列表。
对于这两种方法,让我们假设用户无法预测该方法是否会成功找到匹配项。
如果出现以下情况,方法 1 可能会失败:
- 该数组不包含所需的值。
如果出现以下情况,方法 2 可能会失败:
- 票不够。
- 有足够的门票出售,但价格超过 100 美元。
Java 选择为方法 1 返回与空结果等效的结果,但对方法 2 执行相同操作将无法区分这两种错误。在两种可能的设计之间进行选择的准则是什么?
请注意,虽然这个问题包含两种具体方法,但我正在寻找一般设计指南,而不是上述方法的具体解决方案。
解决方案
最佳方法取决于具体情况。
案例1:
由于该方法返回找到的元素的索引,-1
如果没有找到所需的值,我建议返回。坚持几乎每个人都熟悉的众所周知的 API,比如 for indexOf()
.
案例 2:
这里我建议使用异常 ( InsufficientMoneyException
, OutOfTicketsException
, ...)。一个空列表或者null
不是很有意义,并且不能反映不同的错误情况。这样您就可以正确处理它们各自的 catch 块中的异常。
通常,您必须记住,抛出异常是昂贵的操作,因为必须构建堆栈跟踪。
推荐阅读
- c - “返回 x == y”是什么意思?
- laravel - 如何从关系关系中创建指向用户名的锚链接
- javascript - 数据表过滤背景颜色的列
- java - v3 中的 Google Drive 可恢复上传
- c# - 用第三个数据类库项目在 asp.net core 项目和 .net core 控制台项目之间共享 Sqlite 数据库
- python - 如何修复“psycopg2.errors.InvalidDatetimeFormat:类型日期的无效输入语法:”-
- firebase - Firebase 托管没有防火墙?
- c# - Firestore 错误请求的身份验证范围不足
- python - 如何修复'ValueError:提供的元素过多。张量流中最多需要'错误?
- java - 使用 selenium webdriver 选择按钮的问题