SpringMVC异常处理

在项目中怎样处理出现的异常,在每一个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的。那么怎样保证我们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容—>异常处理。

在Spring MVC中我们能够通过下面2中途径来对异常进行集中处理:

一.继承HandlerExceptionResolver接口实现自己的处理方法,如:

复制代码
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {   
  
    @Override  
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {   

        //加入自己的异常处理逻辑,如日志记录等        

         // TODO Auto-generated method stub   
        return new ModelAndView("exception");   
    }   
  
}
复制代码

然后在项目的配置文件里加入:

<bean id="exceptionResolver" class="所在包名.MyHandlerExceptionResolver"/>

这样就完毕了异常的捕捉和处理。

 

二.我们介绍了第一种捕捉处理异常方式,可是第一种方式须要在配置文件里进行配置,有的时候我们会认为配置文件内容太多太乱。那么我们就能够借助@ExceptionHandler注解来实现零配置的异常捕捉和处理。

首先,在我们项目的包com.demo.web.controllers中为controller建立一个父类BaseController。内容例如以下:

复制代码
package com.demo.web.controllers;

import java.sql.SQLException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ExceptionHandler;

public abstract class BaseController {  

    @ExceptionHandler
    public String exception(HttpServletRequest request, Exception e) {  
          
      //加入自己的异常处理逻辑,如日志记录   
        request.setAttribute("exceptionMessage", e.getMessage());  
          
        // 依据不同的异常类型进行不同处理
        if(e instanceof SQLException) 
            return "testerror";   
        else
            return "error";  
    }  
    
}
复制代码

 

其次,改动项目中HelloWorldController让它继承于BaseController以便进行測试:

public class HelloWorldController extends BaseController{
    //...内容省略
}

然后,改动HelloWorldController 中的index方法,使其抛出异常,看能不能正常捕捉:

复制代码
//@AuthPassport
@RequestMapping(value={"/index","/hello"})
public ModelAndView index() throws SQLException{
    
    throw new SQLException("数据库异常。");
    
    /*ModelAndView modelAndView = new ModelAndView();  
    modelAndView.addObject("message", "Hello World!");  
    modelAndView.setViewName("index");  
    return modelAndView;*/
}
复制代码

最后,在views目录中加入testerror.jsp视图来显示错误信息:

复制代码
<%@ 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>error!</title>
</head>
<body>
    ${exceptionMessage}
</body>
</html>
复制代码

执行项目:

1

能够看到异常已经被捕捉并显示,这样仅仅要把我们的其他的Controller所有继承于BaseController就能实现异常的集中捕捉和处理了。