zoukankan      html  css  js  c++  java
  • SpringMVC学习系列(10) 之 异常处理

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

    在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就能实现异常的集中捕捉和处理了。

    代码下载:http://pan.baidu.com/s/1c0eTseG

    注: 之前没注意前11篇的示例代码,不知道为什么当时打包上传上去的是没有.project项目文件的,导致下载后不能直接导入eclipse运行,虚拟机又 被我删掉了,这些示例代码也没有备份,但是代码文件还在的,所以可以新建一个Dynamic Web Project把对应的配置文件和controller还有view导入就可以了,给大家造成的不便说声抱歉。

  • 相关阅读:
    According to TLD or attribute directive in tag file, attribute end does not accept any expressions
    Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already in use.
    sql注入漏洞
    Servlet—简单的管理系统
    ServletContext与网站计数器
    VS2010+ICE3.5运行官方demo报错----std::bad_alloc
    java 使用相对路径读取文件
    shell编程 if 注意事项
    Ubuntu12.04下eclipse提示框黑色背景色的修改方法
    解决Ubuntu环境变量错误导致无法正常登录
  • 原文地址:https://www.cnblogs.com/liukemng/p/3753117.html
Copyright © 2011-2022 走看看