要继承Exception类自定义受检异常,需继承Exception(非RuntimeException)、命名体现业务语义(如InsufficientBalanceException)、提供三种标准构造方法,并在方法签名中用throws声明,调用方必须显式处理。

要继承 Exception 类自定义一个与业务绑定的受检异常,关键在于:继承 Exception(而非 RuntimeException),提供语义清晰的类名和构造方法,并在业务逻辑中主动抛出和捕获它。
继承 Exception,确保是受检异常
Java 中只有继承 Exception 或其子类(但不继承 RuntimeException)的异常才是受检异常(checked exception)。编译器会强制调用方处理它(try-catch 或 throws)。
例如,不要写 class BizException extends RuntimeException —— 这样就变成非受检异常,无法满足“强制处理业务异常”的设计意图。
命名体现业务语义
类名应明确反映业务场景,避免泛泛叫 BizException。比如:
-
InsufficientBalanceException(余额不足) -
OrderAlreadyShippedException(订单已发货) -
InvalidPromotionCodeException(促销码无效)
这样调用方一眼就能理解异常含义,也便于后续日志归类、监控告警或前端提示映射。
提供实用的构造方法
至少保留以下三种常见构造方式:
public XxxException(String message)public XxxException(String message, Throwable cause)public XxxException(Throwable cause)
示例:
public class InsufficientBalanceException extends Exception {
public InsufficientBalanceException(String message) {
super(message);
}
public InsufficientBalanceException(String message, Throwable cause) {
super(message, cause);
}
public InsufficientBalanceException(Throwable cause) {
super(cause);
}
}
在业务方法中声明并抛出
方法签名需用 throws 声明该异常,调用方必须显式处理:
- 服务层方法如
void transfer(Long fromId, Long toId, BigDecimal amount) throws InsufficientBalanceException - 内部校验失败时直接
throw new InsufficientBalanceException("账户余额不足")
注意:不要在 catch 块里吞掉这个异常,也不建议把它包装成 RuntimeException 向上抛——这会绕过受检机制,失去设计初衷。

















