springBoot2.X配置全局捕获异常
先来看一段代码:当传入的id是0的时候,就会报异常。
@RestController
public class HelloController {
@GetMapping("/getUser")
public String getUser(int id) {
int j = 1 / id;
return "SUCCESS" + j;
}
}
访问时:
我们知道这个页面要是给用户看到,用户可能不知道这是什么。
方法一:将异常捕获
@GetMapping("/getUser")
public String getUser(int id) {
int j;
try {
j = 1 / id;
} catch (Exception e) {
return "系统异常";
}
return "SUCCESS" + j;
}
这种方法当然可以,但是当我们有很多方法时,需要在每个方法上都加上。
哎,太鸡肋了吧。
那么都没有全局的拦截处理呢?
当然了
方法二:通过@ControllerAdvice注解配置
/**
* @Author 刘翊扬
* @Date 2020/9/30 11:39 下午
* @Version 1.0
*/
@ControllerAdvice(basePackages = "com.yiyang.myfirstspringdemo.controller")
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)
@ResponseBody
public Map<String,Object> errorResult() {
Map<String, Object> map = new HashMap<>();
map.put("errorCode", "500");
map.put("errorMsg", "全局捕获异常");
return map;
}
}
@ExceptionHandler 表示拦截异常
@ControllerAdvice 是 controller 的一个辅助类,最常用的就是作为全局异常处理的切面类
@ControllerAdvice 可以指定扫描范围
注意:下面还需要在启动类上加上,否则诶呦效果
package com.yiyang.myfirstspringdemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication(scanBasePackages = {"com.yiyang.myfirstspringdemo.error", "com.yiyang.myfirstspringdemo.controller"})
public class MyFirstSpringDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MyFirstSpringDemoApplication.class, args);
}
}
在启动类上,将扫描包范围controller和全局异常处理类,加上去。
这样当我们在访问的时候,出现的异常提示信息就是我们在全局异常处理中设置的返回值。