zoukankan      html  css  js  c++  java
  • Spring MVC异常处理

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

    现在一般很多都是ajax调用,在方法名上@ResponseBody注解,对于这种请求可以采用:

    @ExceptionHandler
    public String exception(HttpServletRequest request, HttpServletResponse response, Exception e) { 
         
        //这里进行通用处理,如日志记录等...
         
         //如果是json格式的ajax请求
         if (request.getHeader("accept").indexOf("application/json") > -1
                 || (request.getHeader("X-Requested-With")!= null && request.getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1)) {
            response.setStatus(500);
            response.setContentType("application/json;charset=utf-8");  
            try {
                PrintWriter writer = response.getWriter(); 
                writer.write(e.getMessage()); 
                writer.flush(); 
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } 
            return null;
         }
         else{//如果是普通请求
            request.setAttribute("exceptionMessage", e.getMessage()); 
     
            // 根据不同的异常类型可以返回不同界面
            if(e instanceof SQLException)
                return "testerror";  
            else
                return "error"; 
        }
    } 
  • 相关阅读:
    产品开发管理之流程和体系(总篇)
    .NET Core工程编译事件$(TargetDir)变量为空引发的思考
    EF Core新增迁移时无法加载程序集“System.ValueTuple”的错误
    Magicodes.Admin.Core开源框架总体介绍
    在WIN SERVER 2016上安装DOCKER(带过坑)
    使用NPOI生成Excel级联列表
    使用批处理根据项目工程文件生成Nuget包并发布(支持.NET Core)
    C#反射
    Oracle创建库
    深入了解MyBatis参数
  • 原文地址:https://www.cnblogs.com/drizzlewithwind/p/6082694.html
Copyright © 2011-2022 走看看