You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

方法遇可预测但不可避免失败:返回空结果还是抛出异常?

可预测但不可避免的失败:返回空结果还是抛异常?

这个问题问到点子上了——其实核心是要分清「业务流程内的预期结果」和「超出常规的异常错误」,咱们结合你给的两个例子具体拆解:

核心判断原则

简单说:如果失败是业务逻辑里完全可预见的正常分支,就返回空/特定标识结果;如果失败是打破正常流程的意外错误,就抛出异常。


示例1:类似Arrays.binarySearch()的索引查找方法

这种场景下,「查找的元素不存在」是完全符合预期的业务情况——调用方本来就知道数组里可能没有目标元素,甚至可能就是要验证这一点。

所以像Arrays.binarySearch()那样返回特定非正值(而不是空或异常)是最优设计,理由有三个:

  • 调用方可以直接通过返回值判断结果,不需要额外写try-catch,代码更简洁流畅
  • 这种失败是可预测的,不属于“意外错误”,用异常会带来不必要的性能开销(比如异常栈的追踪)
  • 符合开发者的使用习惯,大家对标准库的这种模式已经形成共识,学习成本低

示例2:Tickets.buy(20, 100)购票方法

这个场景要分两种情况看:

情况1:票不足/预算不够

如果「票量不足20张」或者「100美元买不到20张票」是票务业务里的正常情况(比如热门演出经常售罄、票价波动),那**返回空票单(或者一个明确标记“购票失败”的对象)**才是合理的:

  • 这属于业务流程的一部分,调用方本来就需要处理这种情况(比如提示用户减少购票数量、换场次)
  • 要是用异常来处理,会把正常的业务逻辑硬生生变成错误处理逻辑,代码会变得混乱不堪

情况2:系统故障

如果失败是因为票务系统崩溃、网络断连、参数非法(比如传入负数购票数)这种超出正常业务流程的意外,那必须抛出异常:

  • 这种情况不是调用方能够提前预判并处理的业务分支,用异常可以明确通知上层代码“出问题了,需要处理错误”
  • 异常还能携带错误详情,方便排查问题

总结一下通用规则

  • ✅ 返回空/特定结果:失败是业务逻辑内可预见的正常分支,调用方需要基于这个结果继续业务流程
  • ❌ 抛出异常:失败是意外错误,不属于正常业务流程,需要中断当前流程并处理错误

内容的提问来源于stack exchange,提问作者Gili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:48:35