springmvc之异常处理(包含处理步骤)

目录

一、介绍

1.异常

2.出现异常现象的常见位置和常见诱因如下

3.异常的分类

(1)业务异常(BusinessException)

(2)系统异常(SystemException)

(3)其他异常(Exception)

4.异常的注解

(1)@restcontrolleradvice

(2)@ExceptionHandler

扫描二维码关注公众号,回复: 14610893 查看本文章

5.异常怎么处理?

二、出现异常的解决例子

1.在一个类里面进行自定义异常种类编号

2.在可能会出现异常的地方标记这些编号(触发自定义异常) 

3.统一在一个类里面去拦截处理这些出现的异常(异常里面带了编号)

4.处理结果展示


一、介绍

1.异常

在程序开发过程当中不可避免遇到异常现象。系统中的Dao、Service、Controller出现都通过throws  Exception向上抛出,最后由springMVC前端控制器交由异常处理器进行异常处理。

通俗理解:就是一层一层往上抛直到抛给前端控制器调用异常处理器处理

2.出现异常现象的常见位置和常见诱因如下

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

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

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

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

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

3.异常的分类

(1)业务异常(BusinessException)

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

解决办法:发送对应的消息传递给用户,提醒规范操作

(2)系统异常(SystemException)

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

解决办法:发送固定消息给用户,安抚用户(例如,您的网络不通畅,请稍后再试)。还有发送特定的消息给运维人员,提醒维护。记录日志

(3)其他异常(Exception)

编程人员没有预测到的异常。

解决办法:发送固定的消息给用户,安抚用户,发送特定的消息给编程人员,提醒维护。记录日志

4.异常的注解

(1)@restcontrolleradvice

这个注解是异常注解,放在类上面,代表这个类统一处理异常,是rest开头的,代表处理rest风格的异常,基于AOP思想,所以又含有advice,通常配合@ExceptionHandler使用,这个异常代表指定要拦截哪些异常。

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

作用:为Rest风格开发的控制器类做增强(此注解自带ResponseBody注解和Component注解,具备对应的功能)

(2)@ExceptionHandler

这个注解是拦截指定异常的,通常写在方法的上面。告诉这个方法里面要拦截哪些异常。与@restcontrolleradvice搭配使用比较多

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

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

5.异常怎么处理?

在各个层级出现了异常要分别处理很麻烦,就统一放到最上层的表现层去统一处理就好了 。要用AOP的思想去处理。

(1)使用Spring MVC提供的简单异常处理器SimapleMappingExceptionResolver

(2)实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器(推荐)

二、出现异常的解决例子

总结

1.在一个类里面进行自定义异常种类编号

//1:自定义项目系统级异常
public class SystemException extends RuntimeException{
    private Integer 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;
    }

    public Integer getCode() {
        return code;
    }
    public void setCode(Integer code) {
        this.code = code;
    }
}
//2:自定义项目业务级异常
public class BusinessException extends RuntimeException{
    private Integer 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;
    }
    public Integer getcode() {
        return code;
    }
    public void setCode (Integer code) {
        this.code = code;
    }
}
//3.自定义异常编号
public class code {
    public static final Integer SYSTEM_UNKNOW_ERROR = 50001;
    public static final Integer SYSTEM_TIMEOUT_ERROR =50002;
    public static final Integer PROJECT_VAL IDATE_ERROR = 60001;
    public static final Integer PROJECT_BUSINESS_ERROR = 60002;
}

2.在可能会出现异常的地方标记这些编号(触发自定义异常) 

//4.标记可能会出现异常的地方
@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;
    public Book getById(Integer id){
        if( id<0 ){
            throw new BusinessException(Code.PROECT_BUSINESS_ERROR , "请勿进行非法操作! ");
        }
        return bookDao.getById(id);
    }
}

3.统一在一个类里面去拦截处理这些出现的异常(异常里面带了编号)

//5:拦截并处理异常
@RestControllerAdvice
public class ProjectExceptionAdvice {
    @ExceptionHandler (BusinessException.class)
    public Result doBusinessException(BusinessException ex){
        return new Result(ex.getCode() , null,ex.getMessage());
    }
    @ExceptionHandler (SystemException.class)
    public Result doSystemException(SystemException ex){
        /记录日志(错误堆栈)
        //发送邮件给开发人员
        //发送短信给运维人员
        return new Result(ex.getCode() ,null,ex.getMessage());
    }
    @ExceptionHandler(Exception.class)
    public Result doException(Exception ex){
        /记录日志(错误堆栈)
        //发送邮件给开发人员
        //发送短信给运维人员
        return new Result(Code.SYSTEM_UNKNOW_ERROR , null, "系统繁忙,请联系管理员!");
    }
}

4.处理结果展示

{
"data" : null,
"code" : 60002,
"msg":"请勿进行非法操作!”
}

有什么问题都可以评论区留言,看见都会回复的

如果你觉得本篇文章对你有所帮助的,多多支持吧!!!

点赞收藏评论,抱拳了!

猜你喜欢

转载自blog.csdn.net/m0_52861000/article/details/129230073
今日推荐