SpringMVC(五):异常处理器

目录

一、异常处理器

1、出现异常现象的常见位置与常见诱因

2、细节

3、异常处理器

二、项目异常处理

1、项目异常分类

2、项目异常处理方案

3、项目异常处理代码实现


一、异常处理器

1、出现异常现象的常见位置与常见诱因

        框架内部抛出的异常:因使用不合规导致

        数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)

        业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)

        表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)

        工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)

2、细节

        每个层都会出现异常,应该在表现层进行处理。

        为了简化代码书写强度,应采用AOP思想。

3、异常处理器

(1)异常处理器代码

@RestControllerAdvice  //用于标识当前类为REST风格对应的异常处理器
public class ProjectExceptionAdvice {

    //统一处理所有的Exception异常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
        return new Result(666,null);
    }
}

(2) @RestControllerAdvice注解介绍

- 名称:@RestControllerAdvice

- 类型:==类注解==

- 位置:Rest风格开发的控制器增强类定义上方

- 作用:为Rest风格开发的控制器类做增强

- 说明:此注解自带@ResponseBody注解与@Component注解,具备对应的功能

(3)@ExceptionHandler注解介绍

- 名称:@ExceptionHandler

- 类型:==方法注解==

- 位置:专用于异常处理的控制器方法上方

- 作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行

- 说明:此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常

二、项目异常处理

1、项目异常分类

(1)业务异常(BusinessException

        规范的用户行为产生的异常

        不规范的用户行为操作产生的异常

(2)系统异常(SystemException

        项目运行过程中可预计且无法避免的异常

(3)其他异常(Exception

        编程人员未预期到的异常

2、项目异常处理方案

(1)业务异常(BusinessException

        发送对应消息传递给用户,提醒规范操作

(2)系统异常(SystemException

        发送固定消息传递给用户,安抚用户

        发送特定消息给运维人员,提醒维护

        记录日志

(3)其他异常(Exception

        发送固定消息传递给用户,安抚用户

        发送特定消息给编程人员,提醒维护(纳入预期范围

        记录日志

3、项目异常处理代码实现

1、根据异常分类自定义异常类

(1)自定义项目系统级异常

//自定义异常处理器,用于封装异常信息,对异常进行分类
public class SystemException extends RuntimeException{
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public SystemException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public SystemException(Integer code, String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }
}

(2)自定义项目业务级异常

//自定义异常处理器,用于封装异常信息,对异常进行分类
public class BusinessException extends RuntimeException{
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public BusinessException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public BusinessException(Integer code,String message,Throwable cause) {
        super(message, cause);
        this.code = code;
    }
}

 2、自定义异常编码(持续补充)

public class Code {
	//状态码,可以根据需要自己编写
    public static final Integer SYSTEM_ERR = 50001;
    public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
    public static final Integer SYSTEM_UNKNOW_ERR = 59999;
    public static final Integer BUSINESS_ERR = 60002;
}

3 、触发自定义异常

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;

	//在getById演示触发异常,其他方法省略没有写进来
    public Book getById(Integer id) {
        //模拟业务异常,包装成自定义异常
        if(id <0){
            throw new BusinessException(Code.BUSINESS_ERR,"忙碌中!");
        }
    }
}

4、在异常通知类中拦截并处理异常

@RestControllerAdvice //用于标识当前类为REST风格对应的异常处理器
public class ProjectExceptionAdvice {
    //@ExceptionHandler用于设置当前处理器类对应的异常类型
    @ExceptionHandler(SystemException.class)
    public Result doSystemException(SystemException ex){
        //记录日志
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    @ExceptionHandler(BusinessException.class)
    public Result doBusinessException(BusinessException ex){
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    //除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
        //记录日志
        return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悠哉iky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值