【SpringBoot】SpringBoot 之 使用AOP技术 全局捕获异常

本文源码:https://github.com/SsRong/springboot2.0-ssrtest02

1、全局捕获异常:整个Web请求项目 全局捕获异常

1.1、应用场景:如果在我们的一个类的方法中出现异常(以项目中的ErrorController为例),那么在用户请求页面时则会报出原生的英文404错误。因此我们需要使用到try catch来把异常抛出。

1.2、但如果我们需要用到异常抛出的方法太多,那么在每个方法中写try catch就会非常麻烦,因此我们需要使用到全局捕获异常的方式。

2、全局捕获异常的原理:  使用AOP技术,采用异常通知

2.1、实施方法 (准备步骤:新建一个和controller包同级的error 包,建一个类)

【SpringBoot】SpringBoot 之 使用AOP技术 全局捕获异常_第1张图片

2.1.1、捕获返回json格式:

1、添加注解@ControllerAdvice(basePackages="com.ssrtest02.controller");用于扫描controller包中存在的所有异常

2、在类中添加拦截方法errorResult(),方法返回一个Map类型的集合(errorResultMap),方法使用注解@ResponseBody 表示方法以json形式返回给客户端

3、在方法中写上定义好的Map集合

4、在拦截方法errorResult()上再添加一个@ExceptionHandler(RuntimeException.class),表示该方法主要拦截的异常类型,这里的异常类型为RuntimeException(运行时异常)

5、注意:此时我们存在异常的controller类里就不能再用try catch了。也就是把异常交给我们的全局异常处理方法来解决

6、在实际的公司开发中,我们是需要把这些错误写到日志中的

7、GlobalExceptionHandler类源码:

package com.ssrtest02.error;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.HashMap;
import java.util.Map;

/**
 * 全局捕获异常 使用AOP技术,采用异常通知方法
 * 1、捕获返回json格式
 * 2、捕获返回页面
 */
@ControllerAdvice(basePackages = "com.ssrtest02.controller")
public class GlobalExceptionHandler {

    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public Map errorResult(){
        //注意:在实际的公司开发过程中,要把错误记录在日志中
        Map errorResultMap=new HashMap();
        errorResultMap.put("errorCode","1314520");
        errorResultMap.put("errorMsg","系统喜欢你到死机");
        return errorResultMap;
    }
}

8、errorController类代码:

package com.ssrtest02.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ErrorController {
  //  private static final Logger logger =  LoggerFactory.getLogger(JspController.class);

    @RequestMapping("/getUser")
    public String getUser(int i){
        //这是在没有全局异常处理时,我们对异常的处理
//        int j=0;
//        try {
//            j = 1 / i;
//        }catch (Exception e){
//            return "系统异常";
//        }

        //这是我们开始使用全局异常处理后的代码,在本方法类里就不需要在进行异常的处理了
        int j = 1 / i;
        return "success  "+j;
    }

    @RequestMapping("/getMember")
    public String getMember(String name, Integer age){

    //    logger.info("name"+name+",age:"+age);
        return "success getMember";
    }
}

2.1.2、捕获返回页面

和上面步骤基本一致,但需要把方法的注解改成@modeAndView

你可能感兴趣的:(SpringBoot学习笔记)