统一异常处理

前言

先看一个基础的案例

@Controller
@RequestMapping("demo")
public class DemoController {
    @RequestMapping("demo")
    public String demo(){
        try {
            System.out.println("demo ok ...");
            int n = 1/0;//报错: 除零异常
        } catch (Exception e) {
          e.printStackTrace();
            return "500";
        }
        return "hello";
    }
}

上述是我们手动加try-catch的过程,试想一下,如果每遇到一个异常,我们都要这样手动去处理的话,业务代码一旦多起来以后,我们处理异常就会很麻烦,所以我们下面会介绍两种处理方式。

传统方式异常处理

创建一个controller类

@Controller
@RequestMapping("demo")
public class DemoController {
    @RequestMapping("demo")
    public String demo(){
        System.out.println("demo ok ...");
        int n = 1/0;//报错: 除零异常
        return "hello";
    }
    @RequestMapping("login")
    public String login(String username,String password){
        System.out.println("login ...");
        System.out.println("username: "+username);
        System.out.println("password: "+password);
        if("xiaochen".equals(username) && "123".equals(password)){
            return "hello";//返回成功页面
        }else{
            throw new UserNameNotFoundException("用户名不正确!!");
        }
    }
}

创建一个GlobalException

@Component
public class GlobalException  implements HandlerExceptionResolver {

    //resolveExcpetion: 当控制器中任意一个方法出现异常时,如果该控制器的方法没有自己异常处理(try...catch),则会进入当前方法
    //注意:在异常处理这个方法中 完成自定义异常处理
    //参数1: request 当前请求对象
    //参数2: response 当前请求对应响应对象
    //参数3: 当前出现错误的方法对象
    //参数4: 出现异常的异常对象
    //返回值: modelAndview 模型和视图
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
        System.out.println("这是全局异常处理....");
        System.out.println("当前异常为: "+ex);
        ModelAndView modelAndView = new ModelAndView();
        //针对不同异常类型跳转不同页面
        if(ex instanceof UserNameNotFoundException){
            modelAndView.setViewName("error");
            return modelAndView;
        }
        modelAndView.setViewName("500");
        return modelAndView;
    }
}

异常处理展示
统一异常处理_第1张图片

统一异常处理_第2张图片

前后端分离方式异常处理

准备一个controller请求

@RestController
@RequestMapping("demo")
public class DemoController {
    

    @GetMapping("/{id}")
    public ResponseEntity<String> demo(@PathVariable("id") Integer id) {
        System.out.println("demo ok "+id);
        if(id<0) throw new IllegalNumberException("无效id,请检查!");
        return new ResponseEntity<>("demo ok ", HttpStatus.OK);
    }
    @GetMapping
    public ResponseEntity<String> demo(){
        System.out.println("demo ok!");
        int n=1/0;
        return new ResponseEntity<>("demo ok!",HttpStatus.OK);
    }
}

定义一个GlobalException类

@ControllerAdvice
public class GlobalException {

    //处理exception子类异常
    @ExceptionHandler(value = Exception.class) //用在方法上  作用:用来处理指定异常  value属性: 用来指定处理异常类型
    @ResponseBody
    public ResponseEntity<String> exceptionHandler(Exception ex) {
        System.out.println("进入自定义异常处理");
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
    @ExceptionHandler(value = IllegalNumberException.class) //用在方法上  作用:用来处理指定异常  value属性: 用来指定处理异常类型
    @ResponseBody
    public ResponseEntity<String> illegalNumberExceptionHandler(Exception ex) {
        System.out.println("进入非法参数异常的处理");
        return new ResponseEntity<>(ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

异常处理展示:

统一异常处理_第3张图片
统一异常处理_第4张图片

你可能感兴趣的:(spring,boot,java,后端)