自定义异常个人理解
在大部分业务系统中都有定义自己的异常类型,用于区分于一般的Exception 以及 RunntimeException 。
截止目前为止我认为这个自定义异常的作用更多的是可以用于将自己业务系统中的错误更明显的区分出来。
通过识别异常类型为自己定义的异常来做一些特别的异常信息处理和返回,或者当出现某个自定义的业务异常后针对某个或者某些异常做额外的代码处理。
自定义异常更多的是去迎合自己的业务定义,可以根据自己的开发需要去定义异常的构建方法和组成参数,但基本还是基于 RunntimeException 去继续延伸这个类。
配合自定义异常,我们可以定义所有返回或者异常的结果枚举,用来更好的管理所有异常信息。
这样在相同场景下即使是异常信息都可以被复用。
简单案例总结
自定义异常类
package org.aurora.exception;
/**
* 自定义业务异常
*/
public class MyException extends RuntimeException{
/**
* 结果枚举 可以用于定义代码中业务异常返回结果枚举
*/
private ResultCode resultCode;
public ResultCode getResultCode() {
return resultCode;
}
public MyException(ResultCode resultCode){
super(resultCode.getMessage());
this.resultCode = resultCode;
}
/**
* @param resultCode 中message 带有 %s 的参数
* @param message 替换%s 位置上的内容
*/
public MyException(ResultCode resultCode, String... message){
super(String.format(resultCode.getMessage(), message));
this.resultCode = resultCode;
}
// 一般入参构造即原有 RuntimeException 提供的构建
public MyException(String message){
super(message);
}
public MyException(Throwable throwable){
super(throwable);
}
public MyException(String message, Throwable throwable){
super(message, throwable);
}
}
自定义结果枚举
(没有引入 @Getter lombok 可以去掉使用传统快捷键生成get 方法)
package org.aurora.exception;
import lombok.Getter;
@Getter
public enum ResultCode {
SUCCESS(200, "操作成功"),
FAIL(500, "操作失败"),
FORBIDDEN(401, "请先登录"),
BUSINESS_EXCEPTION(50200, "业务异常: %s"),
// ......可以有更多的其他枚举
// 枚举结束符
;
// 基本信息
private int code;
private String message;
ResultCode() {
}
ResultCode(int code, String message) {
this.code = code;
this.message = message;
}
}
实际业务中大致可以如下:
try {
// .....可能会抛出自定义异常的内容
} catch (MyException e){
}
// 或者主动抛出
Integer ms = 156;
this.changeMs(ms);
if (ms < 0){
throw new MyException(ResultCode.FAIL);
}