-
1.自定义统一异常处理器
自定义Exception实现 HandlerExceptionResolver接口或继承AbstractHandlerExceptionResolver类
1.实现接口HandlerExceptionResolver
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354packagecom.jay.platform.exception.handler;importjava.io.IOException;importjava.net.ConnectException;importjava.net.SocketTimeoutException;importjava.util.Date;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.log4j.Logger;importorg.springframework.web.servlet.HandlerExceptionResolver;importorg.springframework.web.servlet.ModelAndView;importcom.jay.platform.exception.AjaxException;importcom.jay.platform.exception.BusinessException;/**** @ClassName: ExceptionHandler* @Description: 统一异常处理 , 注意这里可以处理Controller层抛出的异常,但不处理Controller捕获的异常(Controller捕获的异常,这里不再处理)* @author Jay He* @date 2014年11月4日 上午10:22:11**/publicclassExceptionHandlerimplementsHandlerExceptionResolver {privatestaticfinalLogger LOGGER = Logger.getLogger(ExceptionHandler.class);@OverridepublicModelAndView resolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) {LOGGER.error(newDate().toLocaleString() +"异常信息", ex);if(exinstanceofNumberFormatException) {returnnewModelAndView("exception/number");}elseif(exinstanceofNullPointerException) {returnnewModelAndView("exception/null");}elseif(exinstanceofBusinessException) {returnnewModelAndView("exception/business");}elseif(exinstanceofSocketTimeoutException|| exinstanceofConnectException) {try{response.getWriter().write("网络异常");}catch(IOException e) {e.printStackTrace();}returnnewModelAndView("exception/net_error");}elseif(exinstanceofAjaxException){System.out.println("-=-=");}returnnewModelAndView("exception/exception");}}
2.继承AbstractHandlerExceptionResolver类
12345678910111213141516171819202122232425262728293031323334packagecom.jay.platform.exception.handler;importjava.io.IOException;importjava.net.ConnectException;importjava.net.SocketTimeoutException;importjava.util.Date;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.log4j.Logger;importorg.springframework.web.servlet.HandlerExceptionResolver;importorg.springframework.web.servlet.ModelAndView;importorg.springframework.web.servlet.handler.AbstractHandlerExceptionResolver;importcom.jay.platform.exception.AjaxException;importcom.jay.platform.exception.BusinessException;/**** @ClassName: ExceptionHandler* @Description: 统一异常处理 , 注意这里可以处理Controller层抛出的异常,但不处理Controller捕获的异常(Controller捕获的异常,这里不再处理)* @author Jay He* @date 2014年11月4日 上午10:22:11**/publicclassExceptionHandlerextendsAbstractHandlerExceptionResolver{privatestaticfinalLogger LOGGER = Logger.getLogger(ExceptionHandler.class);@OverrideprotectedModelAndView doResolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) {
}}LOGGER.error(new Date().toLocaleString() + "异常信息", ex); if (ex instanceof NumberFormatException) { return new ModelAndView("exception/number"); } else if (ex instanceof NullPointerException) { return new ModelAndView("exception/null"); } else if (ex instanceof BusinessException) { return new ModelAndView("exception/business"); } else if (ex instanceof SocketTimeoutException || ex instanceof ConnectException) { try { response.getWriter().write("网络异常"); } catch (IOException e) { e.printStackTrace(); } return new ModelAndView("exception/net_error"); }else if(ex instanceof AjaxException){ System.out.println("-=-="); } return new ModelAndView("exception/exception");1
在配置文件中添加自定义异常处理模块
12<!-- Spring MVC的统一异常处理 --><beanclass="com.jay.platform.exception.handler.ExceptionHandler"id="exceptionResolver"> </bean>
错误页面展示:
error.jsp
12<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>Error页面
出错信息
错误描述
${errorTips }
错误异常信息栈
${ex }
eception.jsp
12<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>Exception页面
模块开发中,请稍后。。。。。。
2.基于@ControllerAdvice注解实现统一异常处理,可方便返回普通异常和Ajax异常信息
自定义Web层异常处理
WebExceptionHandler.java
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103packagecom.jay.platform.exception.handler;importjava.io.IOException;importjava.net.ConnectException;importjava.net.SocketTimeoutException;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.log4j.Logger;importorg.apache.shiro.authz.UnauthorizedException;importorg.springframework.http.HttpStatus;importorg.springframework.web.bind.ServletRequestUtils;importorg.springframework.web.bind.annotation.ControllerAdvice;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg.springframework.web.bind.annotation.ResponseStatus;importorg.springframework.web.context.request.NativeWebRequest;importorg.springframework.web.servlet.ModelAndView;importcom.jay.platform.exception.AjaxException;importcom.jay.platform.utils.DateUtil;/*** @ClassName: WebExceptionHandler* @Description: Web层异常处理器, -- 这里可以根据不同的异常,写多个方法去处理, 可以处理跳转页面请求,跳到异常指定的错误页,* 也可以处理Ajax请求,根据不通过异常,在页面输出不同的提示信息* operateExp : 处理普通请求* operateExpAjax : 处理Ajax请求* @author Jay He* @date 2015年5月27日 下午5:16:37**/@ControllerAdvicepublicclassWebExceptionHandler {Logger logger = Logger.getLogger(WebExceptionHandler.class);/** 如果抛出UnauthorizedException,将被该异常处理器截获来显示没有权限信息*/@ExceptionHandler({ UnauthorizedException.class})@ResponseStatus(HttpStatus.UNAUTHORIZED)publicModelAndView unauthenticatedException(NativeWebRequest request,UnauthorizedException e) {ModelAndView mv =newModelAndView();mv.addObject("exception", e);mv.setViewName("base/exception/unauthorized");returnmv;}/*** @Title: operateExp* @Description: 全局异常控制,记录日志* 任何一个方法发生异常,一定会被这个方法拦截到。然后,输出日志。封装Map并返回给页面显示错误信息:* 特别注意:返回给页面错误信息只在开发时才使用,上线后,要把错误页面去掉,只打印log日志即可,防止信息外漏* @param: @param ex* @param: @param request* @return: String* @throws:*/@ExceptionHandler(RuntimeException.class)publicString operateExp(RuntimeException ex, HttpServletRequest request) {logger.error(ex.getMessage(), ex);logger.info("************* ------ 异常信息已记录("+ DateUtil.getNow("yyyy-MM-dd HH:mm:ss")+") ------- ***********");request.setAttribute("errorTips", ex.getMessage());request.setAttribute("ex", ex);return"exception/error";}/** 记录Ajax异常日志,并将错误Ajax错误信息传递(回写)给前台展示,* 前台的jQuery的Ajax请求error中,可以打印错误提示信息 -- data.responseText : 这里即是后台传递的错误提示* eg:* $.ajax({type : 'get',dataType : "json",url : ctx + '/test/test',accept:"application/json",success : function(data) {console.log(data);},error : function(data, errorThrown) {console.log(data);alert("error" + data.responseText);}});*/@ExceptionHandler(AjaxException.class)publicvoidoperateExpAjax(AjaxException ex, HttpServletResponse response)throwsIOException {logger.error(ex.getMessage(), ex);logger.info("************* ------ 异常信息已记录("+ DateUtil.getNow("yyyy-MM-dd HH:mm:ss")+") ------- ***********");//将Ajax异常信息回写到前台,用于页面的提示response.getWriter().write("sorry,Ajax请求出错!!!");}@ExceptionHandler(ConnectException.class)publicvoidoperateExpNetException(ConnectException ex, HttpServletResponse response)throwsIOException {logger.error(ex.getMessage(), ex);logger.info("************* ------ 异常信息已记录("+ DateUtil.getNow("yyyy-MM-dd HH:mm:ss")+") ------- ***********");//将Ajax异常信息回写到前台,用于页面的提示response.getWriter().write("sorry,网络连接出错!!!");}}
异常测试
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465packagecom.jay.platform.controller.test;importjava.net.ConnectException;importjava.util.HashMap;importjava.util.Map;importorg.springframework.stereotype.Component;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RequestMethod;importorg.springframework.web.bind.annotation.ResponseBody;importcom.jay.platform.annotation.AjaxExceptionHandler;importcom.jay.platform.exception.AjaxException;@Component@Controller()@RequestMapping("exception")publicclassExceptionHandlerTestController {@RequestMapping("test")publicString getIt(){return"exception/test/test";}@RequestMapping(value="/common",method=RequestMethod.GET)publicMap<string, object=""> commonExcetion()throwsRuntimeException{Map<string, object=""> map =newHashMap<string, object="">();inti=10;if(i==10){thrownewRuntimeException("运行时异常");}returnmap;}@AjaxExceptionHandler(tips="试一把", description="哈啊")@RequestMapping(value="/ajax/net",method=RequestMethod.GET)@ResponseBodypublicMap<string, object=""> AjaxConnectionExcetion()throwsConnectException{Map<string, object=""> map =newHashMap<string, object="">();inti=10;if(i==10){thrownewConnectException("测试 网络连接 异常");}returnmap;}@RequestMapping(value="/ajax/common",method=RequestMethod.GET)@ResponseBodypublicMap<string, object=""> AjaxExcetion()throwsAjaxException{Map<string, object=""> map =newHashMap<string, object="">();inti=10;if(i==10){thrownewAjaxException("测试Ajax异常");}returnmap;}}</string,></string,></string,></string,></string,></string,></string,></string,></string,>
前台页面
<%@ include file="../../common/meta.jsp"%> <script src="${jqueryCtxPath }/jquery-ui-1.11.2.custom/jquery-ui.min.js"></script> <script type="text/javascript"> $(document).ready(function() { $("#test1").click(function(){ $.ajax({ type : 'get', dataType : "json", url : ctx + '/exception/ajax/net', accept:"application/json", success : function(data) { console.log(data); }, error : function(data, errorThrown) { console.log(data); alert("error" + data.responseText); } }); }); $("#test2").click(function(){ $.ajax({ type : 'get', dataType : "json", url : ctx + '/exception/ajax/common', accept:"application/json", success : function(data) { console.log(data); }, error : function(data, errorThrown) { console.log(data); alert("error" + data.responseText); } }); }); }); </script>123<%@ page language="java"contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
页面结果演示
