全局异常捕获和自定义异常类

在代码执行中,不可避免的会出现报错信息。后端需要将这些报错信息告诉前端,前端才可以根据报错情况来给用户展示不同的页面
而后台的报错信息大多情况写前端人员都看不太懂,所以需要后盾人员对报错信息进行处理,然后统一转换成和前端约定好的报错状态码返回给前端

=========================================================

—— 要解决上述的问题,就需要我们对程序中可能出现的异常信息进行捕获。通常有两种处理方式:

第一种:将逻辑代码使用 try…catch 进行异常捕获

形式如下

    try {
        int i = 1 / 0;
    }catch (Exception e){
        e.printStackTrace();
        return "这里有报错!";
    }

如果采用这种方式,虽然可以解决,但是存在弊端,需要我们在所有的业务逻辑代码上全都加上 try…catch 代码冗余,不通用



第二种:使用异常处理器进行全局异常捕获

采用这种方式来实现,我们只需要在项目中定义一个通用的全局异常处理器,就可以解决本项目的所有异常。

import com.dyz.common.exception.MyException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice   // 控制器增强类
@ResponseBody
public class GlobalExceptionHandler {

    /**
     * 处理未知异常
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    public String exception(Exception e){
        e.printStackTrace();
        return "未知异常";	
        // return Result.err(1002, "未知异常"); 这里也可以返回项目中的统一返回类
    }

    /**
     * 处理手动抛出异常
     * 		如果没有自定义异常类,在代码中出现了可预知的异常,可以手动抛出 "RuntimeException"
     * 		如果抛出的是 "RuntimeException", 则会执行此方法
     * @param e
     * @return
     */
    @ExceptionHandler(RuntimeException.class)
    public String exception(RuntimeException e){
        e.printStackTrace();
        return e.getMessage();
        // return Result.err(1003, e.getMessage()); 这里也可以返回项目中的统一返回类
    }
    
    /**
     * 处理手动抛出异常
     * 		如果需要自定义异常类,在代码中出现了可预知的异常,可以手动抛出 "MyException"
     * 		如果捕获到的是 "MyException" 会执行此方法,上面的方法不会执行
     * @param e
     * @return
     */
    @ExceptionHandler(MyException.class)
    public String exception(MyException e){
        e.printStackTrace();
        return e.getMessage();
        // return Result.err(1003, e.getMessage()); 这里也可以返回项目中的统一返回类
    }
}

完事儿!


自定义异常类:
/**
 * 自定义异常
 */
public class MyException extends RuntimeException {
    // 异常状态码
    private Integer code;

    public MyException() {
        super();
    }

    public MyException(String msg) {
        super(msg);
    }

    public MyException(Integer code, String msg){
        super(msg);
        this.code = code;
    }

    public Integer getCode() {
        return code;
    }
}
写个接口测试一下
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/myTest")
public class MyController {

    @GetMapping("/{name}")
    public String myTest(@PathVariable("name") String name){

        if (name.equals("zhangsan")){	// 如果参数是"zhangsan",返回结果"我这儿报错了"
            throw new MyException("我这儿报错了");
        }
        if (name.equals("lisi")){	// 如果参数"name"是"lisi",返回结果是"未知异常"
            int i = 1/0;
        }
		// 否则,控制台打印"controller 执行了。。。",返回结果是"success"
        System.out.println("controller 执行了。。。");
        return "success";
    }
}

测试结果如下:
全局异常捕获和自定义异常类_第1张图片
全局异常捕获和自定义异常类_第2张图片
全局异常捕获和自定义异常类_第3张图片
就这样,再会!

你可能感兴趣的:(java,前端,java,javascript)