Springboot
默认的异常处理方式BasicErrorController
是springboot
默认异常处理的一个controller
,当程序发生异常了之后会默认请求到BasicErrorController
,在这个controller
中会返回一个页面。
@ExceptionHandler
注解用于捕获和处理控制器中抛出的异常,而且只能处理当前控制器
@RestController
public class TestController {
@GetMapping("/exception")
public void testException () {
throw new NullPointerException("kongle");
}
@ExceptionHandler(value={java.lang.NullPointerException.class})
public String nullPointerExceptionHandler(Exception e){
return "出错了";
}
}
捕获异常之后还可以返回一个页面,这个页面可以自定义,也可以用springboot
默认的error
页面
@RestController
public class TestController {
@GetMapping("/exception")
public void testException () {
throw new NullPointerException("kongle");
}
@ExceptionHandler(value={java.lang.NullPointerException.class})
public ModelAndView nullPointerExceptionHandler(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("error", "错了");
mv.addObject("timestamp", LocalDateTime.now());
mv.setViewName("error");
return mv;
}
}
@RestControllerAdvice
:定义全局异常处理器是@ControllerAdvice
和@ResponseBody
的结合体。
@ExceptionHandler
:用于捕获异常并处理,这里捕获的异常可以是自己定义的异常,也可以是Java
自带的异常,这里我们用Java
自带的异常
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(value={java.lang.NullPointerException.class})
public String nullPointerExceptionHandler(Exception e){
log.error("报错了 ", e);
return "错误内容:" + e.getMessage();
}
}
@RestController
public class TestController {
@GetMapping("/exception3")
public void testException3 () {
throw new NullPointerException("exception3");
}
}
HandlerExceptionResolver
是一个接口,用于处理controller
中抛出的异常,我们需要自定义一个类实现这个接口,并且重写resolveException
这个方法,这个方法需要返回一个视图。
@Component
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
ModelAndView mv = new ModelAndView();
mv.setViewName("error");
mv.addObject("error", "报错了");
mv.addObject("status", "saliwa");
return mv;
}
}