自定义受检异常强制调用方显式处理,体现可恢复的业务语义而非技术错误;它明确契约、暴露风险、倒逼分层决策,但跨进程场景不适用且易被误用为形式主义。
自定义受检异常对调用者意味着:**必须显式处理,不能忽略**。
只要方法声明了 throws YourCheckedException,编译器就会要求调用方要么用 try-catch 捕获并响应,要么在自己方法签名中继续 throws。这不是建议,是编译期硬性约束。
受检异常不是用来表达空指针、数组越界这类编程错误,而是表达“业务上走到了另一条合法路径”。比如:
InsufficientBalanceException → 调用方可以引导用户充值或换支付方式InvalidCouponStateException → 调用方可返回“该优惠券不可用”,无需重试或告警CreditRejectedException → 上游服务可决定走人工审核,而不是直接失败谁该处理,不是由异常类型决定,而是由调用链中“第一个能做业务决策的位置”决定:
ProductOutOfStockException,不代表它该在这里 try-catch —— 它只负责发现并声明问题@ControllerAdvice 统一转 JSON 响应,是常见且合理的集中处理点,但前提是异常真正抵达了有业务上下文的位置如果只是机械地 throws 向上传递,最终堆到顶层却没做任何用户反馈或降级动作,那这个异常就失去了意义: