SpringMVC学习笔记9——异常处理

本文介绍了SpringMVC中如何通过AOP实现全局异常处理,将业务逻辑与异常处理代码解耦。步骤包括:创建自定义异常类及其子类,定义全局异常处理类,设置视图页面,并展示不同异常情况的输入结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

异常

我们都学过异常处理,就是用try&catch,但是项目比较大,那很多地方需要加上大量的try&catch,而且包含的异常类型会很多,特别费时和麻烦;这里我们可以通过aop来解决这个问题把业务逻辑和异常处理代码分开,实现解耦合;springmvc使用全局的,统一的异常处理,即把controller中的异常都集中到一个地方进行处理

异常处理步骤
  1. 新建maven web项目

  2. 加入依赖

  3. 新建一个自定义异常类 MyUserException ,再定义其子类 NameExceptionAgeException

    MyUserException
    public class MyUserException extends Exception {
    
    public MyUserException() {
        super();
    }
    
    public MyUserException(String message) {
        super(message);
    }
    }
    
    NameException
    public class NameException extends MyUserException{
    
    public NameException() {
        super();
    }
    
    public NameException(String message) {
        super(message);
    }
    }
    
    AgeException(略,同上)
  4. controller抛出NameExceptionAgeException

    @Controller
    public class Mycontroller {
    
    @RequestMapping(value = "/some.do")
    public ModelAndView doSome(String name,Integer age) throws MyUserException {
        ModelAndView mv=new ModelAndView();
    
        //根据请求参数抛出异常
        if( !"zs".equals(name)){
            throw new NameException("姓名出错!!!");
        }
        if(age == null || age > 80){
            throw new AgeException("年龄太大啦!!!");
        }
    
        mv.addObject("msg",name);
        mv.addObject("fun",age);
    
        mv.setViewName("show");
    
        return mv;
    }
    
    }
    
  5. 创建一个普通类,作用全局异常处理类

    • 在类的上面加入@ControllerAdvice
    • 在类中定义方法,在方法上加入@ExceptionHandler
    GlobalExceptionHandler
    @ControllerAdvice
    public class GlobalExceptionHandler {
    
    /**
     * 定义方法,处理发生的异常
     * 处理异常的方法和控制器方法的定义一样,可以有多个参数,可以有ModelAndView
     *                                                 String,void,对象类型的返回值
     * @ExceptionHandler(异常的class):表示异常的类型,当发生此类型异常时,由当前方法处理
     */
    
    
    @ExceptionHandler(value= NameException.class)
    public ModelAndView doNameException(Exception e ){//形参表示Controller抛出的异常对象,通过这个来获取发生的异常
        //处理NameException的异常
    
        /**
         * 异常发生处理逻辑
         * 1.把异常的发生时间,哪个方法发生的,异常错误内容记录到数据库,日志文件
         *
         * 2.发送通知,把异常信息通过邮件,短信或微信发送给相关人员
         *
         * 3.给用户友好提示
         */
    
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","姓名必须为zs才可登陆");
        mv.addObject("ex",e);
        mv.setViewName("nameError");
    
        return mv;
    
    }
    
    @ExceptionHandler(value= AgeException.class)
    public ModelAndView doAgeException(Exception e ){
        //处理AgeException的异常
    
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","所填写年龄过大");
        mv.addObject("ex",e);
        mv.setViewName("ageError");
    
        return mv;
    
    }
    
    @ExceptionHandler
    public ModelAndView doOtherException(Exception e ){
        //处理其他位置的异常
    
        ModelAndView mv=new ModelAndView();
        mv.addObject("msg","未知异常");
        mv.addObject("ex",e);
        mv.setViewName("defaultError");
    
        return mv;
    
    }
    
    }
    
  6. 创建处理异常的视图页面

    分别创建nameError、ageError和defaultError
    nameError.jsp<br/>
    提示信息:${msg}<br/>
    异常信息:${ex.message}
    
  7. 创建springmvc的配置文件

    1. 组件扫描器扫描@Controller注解
    2. 组件扫描器扫描@ControllerAdvice所在的包名
    3. 声明注解驱动
    <!--声明组件扫描器-->
    <context:component-scan base-package="com.mvc.controller"/>
    
    <!--声明视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--前缀:视图文件的路径-->
        <property name="prefix" value="/WEB-INF/view/"/>
        <!--后缀:视图文件的扩展名-->
        <property name="suffix" value=".jsp"/>
    </bean>
    
    
    <!--异常处理需要的两步-->
    <context:component-scan base-package="com.mvc.handler"/>
    <mvc:annotation-driven/>
    

运行结果
正常输入

结果正确

姓名异常输入

当姓名输入zs1

年龄异常输入

当年龄输入99

其他异常输入(如在年龄处输入abc)

当年龄输入abc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值