统一异常处理

本文介绍了JavaWeb开发中处理异常的传统方式,即手动使用try-catch,以及前后端分离后采用@ControllerAdvice和@ExceptionHandler注解的全局异常处理方法。两种方式对比,展示了在不同场景下的异步和针对性异常处理实践。
摘要由CSDN通过智能技术生成

前言

先看一个基础的案例

@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
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忘忧记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值