自定义异常需先定义类(继承exception或runtimeexception),再在业务方法中用throw主动抛出;继承exception为编译期异常,调用方必须处理,适用于可恢复的严重问题;继承runtimeexception为运行时异常,无需强制处理,适用于逻辑错误;应提供带消息和cause的构造方法,并仅在违反业务规则时抛出。

在 Java 中,自定义异常要在业务逻辑中抛出,核心是:先定义异常类(继承 Exception 或 RuntimeException),再在业务方法中用 throw 主动抛出,并配合合理的判断条件和有意义的错误信息。
定义合适的自定义异常类
根据是否需要强制处理,选择继承方式:
- 继承
Exception:编译期异常,调用方必须try-catch或throws,适合严重、预期外但可恢复的业务问题(如“库存不足”“用户状态异常”) - 继承
RuntimeException:运行时异常,调用方无需强制处理,适合程序逻辑错误或不应发生的业务状态(如“非法参数”“重复提交”)
建议加上构造方法,支持传入消息和原始异常(便于链式追踪):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
public class InsufficientStockException extends Exception {
public InsufficientStockException(String message) {
super(message);
}
public InsufficientStockException(String message, Throwable cause) {
super(message, cause);
}
}
在业务方法中按需抛出
不是所有地方都该抛异常,只在真正违反业务规则、无法继续执行时才抛。关键点:
- 检查前置条件(如参数非空、状态合法、资源可用)
- 用
if判断触发条件,满足即throw new XxxException("描述清晰的提示") - 避免在循环里反复抛同一个异常;优先校验再执行,而不是执行失败后补救再抛
public void placeOrder(Long productId, Integer quantity) {
Product product = productMapper.selectById(productId);
if (product == null) {
throw new BusinessException("商品不存在,ID:" + productId);
}
if (product.getStock()
<h3>统一异常处理与信息分层</h3>
<p>抛出只是第一步,还要让异常被合理捕获和响应:</p>
- 在 Controller 层用
@ExceptionHandler捕获自定义异常,转为标准 HTTP 响应(如 400 或 422) - 异常消息不直接暴露敏感信息(如数据库字段名、内部路径),面向前端的提示应友好、可读
- 日志中记录完整堆栈和上下文(如用户 ID、订单号),方便排查
避免常见误区
- 不要用异常代替正常流程控制(比如用
throw实现 if-else 分支) - 不要吞掉自定义异常又抛出泛化异常(如
catch (InsufficientStockException e) { throw new RuntimeException(e); }),会丢失语义 - 异常类名要体现业务含义(如
InvalidCouponException),而非笼统叫BusinessException(除非作为顶层基类)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










