统一异常处理

分享一个WEB系统中统一异常处理类

package com.exception;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

/**
 * 统一异常处理,有效地针对异步和非异步请求
 * 不同异常会到不同页面
 * throw new ParameterException("XXXX")  ---- >  error-parameter.jsp
 * throw new SystemException("XXXX")  ---- >  error-System.jsp
 * throw new Exception("XXXX")  ---- >  error.jsp
 * Status  value
 * 1001 业务异常返回 1001
 * 1002 参数异常返回
 * 1000 其他异常返回
 * @author lanyuan
 * @date 2014-12-10
 */
public class MyExceptionHandler implements HandlerExceptionResolver {

    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) {
        Map<String, Object> model = new HashMap<String, Object>();
        model.put("ex", ex);
        //是否异步请求
         if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request
                 .getHeader("X-Requested-With")!= null && request
                 .getHeader("X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
            // 根据不同错误转向不同页面
                if(ex instanceof SystemException) {
                    response.setStatus(1001);//业务异常返回 1001
                    return new ModelAndView("WEB-INF/jsp/exception/error-system", model);
                }else if(ex instanceof ParameterException) {
                    response.setStatus(1002);//参数异常返回 1002
                    return new ModelAndView("WEB-INF/jsp/exception/error-parameter", model);
                } else {
                    response.setStatus(1000);//其他异常返回 1000
                    return new ModelAndView("WEB-INF/error", model);
                }
         }else{
             try {
                 if(ex instanceof SystemException) {
                        response.setStatus(1001);//业务异常返回 1001
                    }else if(ex instanceof ParameterException) {
                        response.setStatus(1002);//参数异常返回 1002
                    } else {
                        response.setStatus(1000);//其他异常返回 1000
                    }
                 PrintWriter writer = response.getWriter();
                 writer.write(ex.getMessage());
                 writer.flush();
             } catch (IOException e) {
                 model.put("ex", e);
                 return new ModelAndView("WEB-INF/error", model);
             }
             return null;
         }
    }
}
时间: 2024-08-10 02:09:47

统一异常处理的相关文章

使用Spring MVC统一异常处理实战

1 描写叙述 在J2EE项目的开发中.无论是对底层的数据库操作过程.还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常须要处理.每一个过程都单独处理异常,系统的代码耦合度高,工作量大且不好统一.维护的工作量也非常大. 那么,能不能将全部类型的异常处理从各处理过程解耦出来,这样既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护?答案是肯定的. 以下将介绍使用Spring MVC统一处理异常的解决和实现过程. 2 分析 Spring MVC处理异

Spring MVC的Controller统一异常处理:HandlerExceptionResolver

出现异常并不可怕,可怕的是出现了异常,你却不知道,也没有进行异常处理. Spring MVC的Controller出现异常的默认处理是响应一个500状态码,再把错误信息显示在页面上,如果用户看到这样的页面,一定会觉得你这个网站太LOW了. 要解决Controller的异常问题,当然也不能在每个处理请求的方法中加上异常处理,那样太繁琐.Spring MVC提供了一个HandlerExceptionResolver接口,可用于统一异常处理. HandlerExceptionResolver接口 pu

spring-boot实战【07】【转】:Spring Boot中Web应用的统一异常处理

我们在做Web应用的时候,请求处理过程中发生错误是非常常见的情况.Spring Boot提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异常内容. 选择一个之前实现过的Web应用(Chapter3-1-2)为基础,启动该应用,访问一个不存在的URL,或是修改处理内容,直接抛出异常,如: 1 2 3 4 @RequestMapping("/hello") public String hello() throws Exce

011医疗项目-模块一:统一异常处理

010中提到了serivce层抛出异常,然后由Action层去捕获异常去处理,之前的写法是很繁琐的,所以我们这里统一异常处理. Java中进行异常处理: 一类是可预知的异常,程序员在编码时,主动抛出的异常,为了给用户操作提示,提前检查代码中可能存在异常. 通过开发中,采用自定义的异常类,每个异常类表示每一类异常信息.类需要继承Exception类. 本系统采用统一异常类,提供一个属性标识异常类. 另一类是不可预知异常,就是runtimeException异常,通过提高代码编写质量来避免此类异常,

【SpringMVC学习07】SpringMVC中的统一异常处理

我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生.在开发中,不管是dao层.service层还是controller层,都有可能抛出异常,在springmvc中,能将所有类型的异常处理从各处理过程解耦出来,既保证了相关处理过程的功能较单一,也实现了异常信息的统一处理和维护.这篇博文主要总结一下SpringMVC中如何统一处理异常. 1. 异常处理思路 首先来看一下在spr

js构建ui的统一异常处理方案(二)

上一篇文章,我分析了同步代码做异常处理是基于责任链模式,而通过try.catch等语句可以很容易地实现这种责任链模式.但是如果是异步调用,我们无法直接通过try.catch语句实现责任链模式,并且通过一个demo证明使用回调函数的方式去实现去实现异常处理的责任链模式是非常繁琐而且代码难以规范的,适用性不高.有没有什么方式能够使得异步js的责任链模式能够更加简单地实现呢? 对于这个问题,我们还是先回到js异步调用上,随着node和npm的普及,js异步调用也越来越被大家重视,于是乎npm引用了一个

Spring MVC自定义统一异常处理类,并且在控制台中输出错误日志

在使用SimpleMappingExceptionResolver实现统一异常处理后(参考Spring MVC的异常统一处理方法), 发现出现异常时,log4j无法在控制台输出错误日志.因此需要自定义一个继承至SimpleMappingExceptionResolver的 RrtongMappingExceptionResolver类,在RrtongMappingExceptionResolver中通过 log.error(ex.getMessage())的方式输出日志到控制台上.以下是具体的配

Jersey统一异常处理

众所周知,java服务提供者提供给服务请求者应该是特定格式的数据,而不能出现异常栈类似信息,那么jersey中,如何添加统一的异常处理呢? 针对jersey启动如果是实现了ResourceConfig接口的实现类,可以注册自定义的异常处理类. /** * 功能说明:统一异常处理过滤器 * @return <br/> * 修改历史:<br/> * 1.[2016年09月09日上午11:11] 创建方法 by hw */ @Provider public class Exception

MVC 增加统一异常处理机制

原文地址:http://www.cnblogs.com/leoo2sk/archive/2008/11/05/1326655.html 摘要      本文将对"MVC公告发布系统"的发布公告功能添加日志功能和异常处理功能,借此来讨论ASP.NET MVC中拦截器的使用方法.一个小难题      我们继续完善"MVC公告发布系统",这次,我们的需求是对公告发布功能添加日志记录能力,即在发布公告前,记录一次,在公告发布成功后,再记录一次.然后还要使得其具备异常处理,即