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

posted on 2018-03-08 21:15  lichangyun  阅读(324)  评论(0编辑  收藏  举报