统一异常处理

前言

先看一个基础的案例

@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;
    }
}

异常处理展示
在这里插入图片描述

在这里插入图片描述

前后端分离方式异常处理

准备一个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);
    }
}

异常处理展示:

在这里插入图片描述
在这里插入图片描述

相关推荐

  1. dubbo 统一异常处理

    2024-02-12 15:00:03       13 阅读
  2. Spring MVC 中的统一异常处理

    2024-02-12 15:00:03       17 阅读
  3. 75.实现统一异常处理和封装统一返回结果

    2024-02-12 15:00:03       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-12 15:00:03       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-12 15:00:03       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-12 15:00:03       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-12 15:00:03       20 阅读

热门阅读

  1. python udp端口范围映射转发

    2024-02-12 15:00:03       30 阅读
  2. 课时21:内置变量_脚本相关

    2024-02-12 15:00:03       27 阅读
  3. SQl 注入 - 利用报错函数updatexml及extracevalue

    2024-02-12 15:00:03       37 阅读
  4. Jwt生成token以及解析token

    2024-02-12 15:00:03       29 阅读
  5. 多重背包问题 Ⅰ&Ⅱ &Ⅲ

    2024-02-12 15:00:03       32 阅读
  6. AutoSAR(基础入门篇)8.2-IO相关驱动(一)

    2024-02-12 15:00:03       32 阅读
  7. leetcode-Nim 游戏

    2024-02-12 15:00:03       39 阅读
  8. 机器学习简介

    2024-02-12 15:00:03       30 阅读