zoukankan      html  css  js  c++  java
  • springmvc异常处理(非注解与注解)

    1.异常

    程序中的异常一般分为两类:预期异常,运行时异常。前者是我们可预知的,我们一般通过捕获和抛出方式处理这些异常。后者主要通过代码规范、测试等手段来减少异常的发生。一般,我们在系统的DAO、Service层的异常都向上抛出,然后统一的在Controller中进行处理。但是每个Controller中的每个方法都写类似的异常处理逻辑,就显得非常的麻烦,并且代码重复。

    Spring提供了异常处理器(HandlerExceptionResolver)来处理异常。我们定义好处理异常的逻辑,SpringMVC会在任何的Controller出现异常时,调用我们定义的异常处理逻辑。从而实现异常的统一管理,并且避免了代码的重复。

    其异常处理流程如下:

    2.非注解使用异常案例.

    异常分为自定义异常和运行时异常,这就要分别编写自定义异常和运行时异常。

    2.1编写一个controller类,给类方法中出现两个异常,分别是自定义和运行时异常,代码如下:

    @RequestMapping("ex/")
    @Controller
    public class ExceptionController {
        
        @RequestMapping("show/{id}")
        @ResponseStatus(HttpStatus.OK)
        public ModelAndView show(@PathVariable("id") Long id) throws MyException{
            
            ModelAndView mv = new ModelAndView("hello");
    //        自定义异常
            if(id==0){
                throw new MyException("自定义异常出现");
            }
            System.out.println("exception");
            
    //        运行时异常
            System.out.println(1/0);
            
            mv.addObject("msg", "传递参数"+id);
            
            return mv;
        }

    2.2如果出现自定义异常,需要处理,需要编写自定义异常类,且继承Exception,代码如下:

    package cn.exception;
    
    public class MyException extends Exception {
    
        /**
         * 自定义异常
         */
        private static final long serialVersionUID = 1L;
    
    //    提供构造函数
        public MyException() {
            super();
        }
    
        public MyException(String message) {
            super(message);
        }    
    }

    2.3.需要定义异常处理器(编写类实现HandlerExceptionResolver )

    package cn.exception;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.HandlerExceptionResolver;
    import org.springframework.web.servlet.ModelAndView;
    
    public class MyexceptionResolver implements HandlerExceptionResolver {
    
        //异常处理的方法
            @Override
            public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
                    Exception ex) {
                ModelAndView mv = new ModelAndView("error");
                String msg = null;
                // 判断是否是自定义异常
                if(ex instanceof MyException){
                    msg = ex.getMessage();
                }else{
                    // 如果不是,则获取栈信息 
                    StringWriter out = new StringWriter();
                    PrintWriter pw = new PrintWriter(out);
                    ex.printStackTrace(pw);
                    msg = out.toString();
                }
                // 添加异常信息到Model
                mv.addObject("msg", msg);
                return mv;
            }
    
    }

    2.4.在Springmvc配置文件中,配置异常处理器

        <!-- 配置异常处理页面 -->
        <bean class="cn.exception.MyexceptionResolver"></bean>

    2.5.编写异常页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    异常发生了...${msg }
    </body>
    </html>

    3.非注解使用异常案例.

    package cn.controller;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.servlet.ModelAndView;
    
    import cn.exception.MyException;
    
    @ControllerAdvice
    public class ExceptionControllerAdvice {
    
        
    //    处理自定义异常
        @ExceptionHandler(MyException.class)
        public ModelAndView zdyException(MyException e){
            ModelAndView mv = new ModelAndView("error");
            
            mv.addObject("msg", e.getMessage());
            
            return mv;
        }
        
    //    处理运行时异常
        @ExceptionHandler(RuntimeException.class)
        public ModelAndView zdyException(RuntimeException ex){
            ModelAndView mv = new ModelAndView("error");
            
            mv.addObject("msg", ex.getMessage());
            StringWriter out = new StringWriter();
            PrintWriter pw = new PrintWriter(out);
            ex.printStackTrace(pw);
            mv.addObject("msg", out.toString());
            return mv;
        }
        
        
    }

    需要提供自定义异常类,见上面MyException

  • 相关阅读:
    【jQuery日期处理】两个时间大小的比较
    CSS 盒子模型(Box model)中的 padding 与 margin
    如何优雅地制作精排 ePub —— 个人电子书制作规范及基本样式表
    异常处理 Exception
    Log4net
    HttpServerUtility类
    MVC 数据验证
    BigRender
    CSS中的块级元素与行级元素
    使用jQuery.form插件,实现完美的表单异步提交
  • 原文地址:https://www.cnblogs.com/lichangyun/p/8530907.html
Copyright © 2011-2022 走看看