在代码执行中,不可避免的会出现报错信息。后端需要将这些报错信息告诉前端,前端才可以根据报错情况来给用户展示不同的页面
而后台的报错信息大多情况写前端人员都看不太懂,所以需要后盾人员对报错信息进行处理,然后统一转换成和前端约定好的报错状态码返回给前端
=========================================================
—— 要解决上述的问题,就需要我们对程序中可能出现的异常信息进行捕获。通常有两种处理方式:
第一种:将逻辑代码使用 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";
}
}
测试结果如下:
就这样,再会!