SpringBoot中@ExceptionHandler和@ControllerAdvice的使用

1. 通过@ExceptionHandler注解继进行异常处理,可以根据不同的异常,跳转到不同的异常界面(正常都会跳转到同样的src/main/resource/templates/error界面):

在controller中写一个会返回空指针异常的语句:

@GetMapping("showInfo")
public String show() {
    String str = null;
    str.length();
    return "ok!!";
}

在controller中,使用@ExceptionHandler注解,该注解返回值是ModelAndView:

@ExceptionHandler(value = {java.lang.NullPointerException.class})
public ModelAndView nullpointExceptionHandler(Exception e){
    ModelAndView mv = new ModelAndView();
    mv.addObject("err",e.toString());
    mv.setViewName("error1");
    return mv;
}

在controller中,使用@ExceptionHandler注解,该注解返回值是ModelAndView:

指定返回的为src/main/resource/templates中的html界面,名为error1.html:

SpringBoot中@ExceptionHandler和@ControllerAdvice的使用
SpringBoot中@ExceptionHandler和@ControllerAdvice的使用

运行,程序不再指定的error.html界面,而是根据指定的空指针异常错误,转到error1.html:

SpringBoot中@ExceptionHandler和@ControllerAdvice的使用
SpringBoot中@ExceptionHandler和@ControllerAdvice的使用

但是目前使用@ExceptionHandler注解,都是写在controller中的,不能复用,所以使用@ControllerAdvice,进行全局的异常处理:

在src/main/java/com.example.exception2下新建exception包,再新建类GlobalException进行全局异常处理:

SpringBoot中@ExceptionHandler和@ControllerAdvice的使用
SpringBoot中@ExceptionHandler和@ControllerAdvice的使用

将UserController中刚才写的@ExceptionHandler注解语句剪切到GlobalException中,在类名上方写上注解@ControllerAdvice:

package com.example.exception2.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class GlobalException {
    @ExceptionHandler(value = {java.lang.NullPointerException.class})
    public ModelAndView nullpointExceptionHandler(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("err",e.toString());
        mv.setViewName("error1");
        return mv;
    }
    @ExceptionHandler(value = {java.lang.ArithmeticException.class})
    public ModelAndView ArithmeticExceptionHandler(Exception e){
        ModelAndView mv = new ModelAndView();
        mv.addObject("err",e.toString());
        mv.setViewName("error2");
        return mv;
    }
    }

这里面还写了一个算数异常,转到界面error2.html。现在UserController中只有:

package com.example.exception2.controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
@RestController
    public class UserController {
    @GetMapping("showInfo")
    public String show() {
        String str = null;
        str.length();
        return "ok!!";
    }
    @GetMapping("showInfo2")
    public String showInfo2() {
        int a = 10 / 0;
        return "ok!!";
    }
}

运行代码:

SpringBoot中@ExceptionHandler和@ControllerAdvice的使用
SpringBoot中@ExceptionHandler和@ControllerAdvice的使用

@ExceptionHandler为抛出指定异常,可以配合全局异常处理@ControllerAdvice一起使用。

来源:琢磨先生DataBase,本文观点不代表自营销立场,网址:https://www.zyxiao.com/p/135232

发表评论

登录后才能评论
服务中心
服务中心
联系客服
联系客服
侵权联系 投诉举报
返回顶部
河南,挺住!郑州,挺住!一起为他们加油!!