springmvc 统一处理异常
-
1.自定义统一异常处理器
自定义Exception实现 HandlerExceptionResolver接口或继承AbstractHandlerExceptionResolver类
1.实现接口HandlerExceptionResolver
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354package
com.jay.platform.exception.handler;import
java.io.IOException;import
java.net.ConnectException;import
java.net.SocketTimeoutException;import
java.util.Date;import
javax.servlet.http.HttpServletRequest;import
javax.servlet.http.HttpServletResponse;import
org.apache.log4j.Logger;import
org.springframework.web.servlet.HandlerExceptionResolver;import
org.springframework.web.servlet.ModelAndView;import
com.jay.platform.exception.AjaxException;import
com.jay.platform.exception.BusinessException;/***
*
@ClassName: ExceptionHandler*
@Description: 统一异常处理 , 注意这里可以处理Controller层抛出的异常,但不处理Controller捕获的异常(Controller捕获的异常,这里不再处理)*
@author Jay He*
@date 2014年11月4日 上午10:22:11*
*/public
class
ExceptionHandlerimplements
HandlerExceptionResolver {private
static
final
Logger LOGGER = Logger.getLogger(ExceptionHandler.class);@Overridepublic
ModelAndView resolveException(HttpServletRequest request,HttpServletResponse
response, Object handler, Exception ex) {LOGGER.error(new
Date().toLocaleString() +"异常信息",
ex);if
(exinstanceof
NumberFormatException) {return
new
ModelAndView("exception/number");}
else
if
(exinstanceof
NullPointerException) {return
new
ModelAndView("exception/null");}
else
if
(exinstanceof
BusinessException) {return
new
ModelAndView("exception/business");}
else
if
(exinstanceof
SocketTimeoutException||
exinstanceof
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");}}2.继承AbstractHandlerExceptionResolver类
12345678910111213141516171819202122232425262728293031323334package
com.jay.platform.exception.handler;import
java.io.IOException;import
java.net.ConnectException;import
java.net.SocketTimeoutException;import
java.util.Date;import
javax.servlet.http.HttpServletRequest;import
javax.servlet.http.HttpServletResponse;import
org.apache.log4j.Logger;import
org.springframework.web.servlet.HandlerExceptionResolver;import
org.springframework.web.servlet.ModelAndView;import
org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver;import
com.jay.platform.exception.AjaxException;import
com.jay.platform.exception.BusinessException;/***
*
@ClassName: ExceptionHandler*
@Description: 统一异常处理 , 注意这里可以处理Controller层抛出的异常,但不处理Controller捕获的异常(Controller捕获的异常,这里不再处理)*
@author Jay He*
@date 2014年11月4日 上午10:22:11*
*/public
class
ExceptionHandlerextends
AbstractHandlerExceptionResolver{private
static
final
Logger LOGGER = Logger.getLogger(ExceptionHandler.class);@Overrideprotected
ModelAndView 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的统一异常处理 --><bean
class="com.jay.platform.exception.handler.ExceptionHandler"
id="exceptionResolver">
</bean>错误页面展示:
error.jsp12<%@
page language="java"
contentType="text/html;
charset=UTF-8"pageEncoding="UTF-8"%>Error页面
出错信息
错误描述
${errorTips }
错误异常信息栈
${ex }
eception.jsp12<%@
page language="java"
contentType="text/html;
charset=UTF-8"pageEncoding="UTF-8"%>Exception页面
模块开发中,请稍后。。。。。。
2.基于@ControllerAdvice注解实现统一异常处理,可方便返回普通异常和Ajax异常信息
自定义Web层异常处理
WebExceptionHandler.java
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103package
com.jay.platform.exception.handler;import
java.io.IOException;import
java.net.ConnectException;import
java.net.SocketTimeoutException;import
javax.servlet.http.HttpServletRequest;import
javax.servlet.http.HttpServletResponse;import
org.apache.log4j.Logger;import
org.apache.shiro.authz.UnauthorizedException;import
org.springframework.http.HttpStatus;import
org.springframework.web.bind.ServletRequestUtils;import
org.springframework.web.bind.annotation.ControllerAdvice;import
org.springframework.web.bind.annotation.ExceptionHandler;import
org.springframework.web.bind.annotation.ResponseStatus;import
org.springframework.web.context.request.NativeWebRequest;import
org.springframework.web.servlet.ModelAndView;import
com.jay.platform.exception.AjaxException;import
com.jay.platform.utils.DateUtil;/***
@ClassName: WebExceptionHandler*
@Description: Web层异常处理器, -- 这里可以根据不同的异常,写多个方法去处理, 可以处理跳转页面请求,跳到异常指定的错误页,*
也可以处理Ajax请求,根据不通过异常,在页面输出不同的提示信息*
operateExp : 处理普通请求*
operateExpAjax : 处理Ajax请求*
@author Jay He*
@date 2015年5月27日 下午5:16:37*
*/@ControllerAdvicepublic
class
WebExceptionHandler {Logger
logger = Logger.getLogger(WebExceptionHandler.class);/**
如果抛出UnauthorizedException,将被该异常处理器截获来显示没有权限信息*/@ExceptionHandler({
UnauthorizedException.class
})@ResponseStatus(HttpStatus.UNAUTHORIZED)public
ModelAndView unauthenticatedException(NativeWebRequest request,UnauthorizedException
e) {ModelAndView
mv =new
ModelAndView();mv.addObject("exception",
e);mv.setViewName("base/exception/unauthorized");return
mv;}/***
@Title: operateExp*
@Description: 全局异常控制,记录日志*
任何一个方法发生异常,一定会被这个方法拦截到。然后,输出日志。封装Map并返回给页面显示错误信息:*
特别注意:返回给页面错误信息只在开发时才使用,上线后,要把错误页面去掉,只打印log日志即可,防止信息外漏*
@param: @param ex*
@param: @param request*
@return: String*
@throws:*/@ExceptionHandler(RuntimeException.class)public
String 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)public
void
operateExpAjax(AjaxException ex, HttpServletResponse response)throws
IOException {logger.error(ex.getMessage(),
ex);logger.info("*************
------ 异常信息已记录("
+ DateUtil.getNow("yyyy-MM-dd
HH:mm:ss")+
")
------- ***********");//将Ajax异常信息回写到前台,用于页面的提示response.getWriter().write("sorry,Ajax请求出错!!!");}@ExceptionHandler(ConnectException.class)public
void
operateExpNetException(ConnectException ex, HttpServletResponse response)
throws
IOException {logger.error(ex.getMessage(),
ex);logger.info("*************
------ 异常信息已记录("
+ DateUtil.getNow("yyyy-MM-dd
HH:mm:ss")+
")
------- ***********");//将Ajax异常信息回写到前台,用于页面的提示response.getWriter().write("sorry,网络连接出错!!!");}}异常测试
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465package
com.jay.platform.controller.test;import
java.net.ConnectException;import
java.util.HashMap;import
java.util.Map;import
org.springframework.stereotype.Component;import
org.springframework.stereotype.Controller;import
org.springframework.web.bind.annotation.RequestMapping;import
org.springframework.web.bind.annotation.RequestMethod;import
org.springframework.web.bind.annotation.ResponseBody;import
com.jay.platform.annotation.AjaxExceptionHandler;import
com.jay.platform.exception.AjaxException;@Component@Controller()@RequestMapping("exception")public
class
ExceptionHandlerTestController {@RequestMapping("test")public
String getIt(){return
"exception/test/test";}@RequestMapping(value="/common",method=RequestMethod.GET)public
Map<string, object="">
commonExcetion()throws
RuntimeException{Map<string,
object="">
map =new
HashMap<string, object="">();int
i=10;if(i==10){throw
new
RuntimeException("运行时异常");}return
map;}@AjaxExceptionHandler(tips="试一把",
description="哈啊")@RequestMapping(value="/ajax/net",method=RequestMethod.GET)@ResponseBodypublic
Map<string, object="">
AjaxConnectionExcetion()throws
ConnectException{Map<string,
object="">
map =new
HashMap<string, object="">();int
i=10;if(i==10){throw
new
ConnectException("测试
网络连接 异常");}return
map;}@RequestMapping(value="/ajax/common",method=RequestMethod.GET)@ResponseBodypublic
Map<string, object="">
AjaxExcetion()throws
AjaxException{Map<string,
object="">
map =new
HashMap<string, object="">();int
i=10;if(i==10){throw
new
AjaxException("测试Ajax异常");}return
map;}}</string,></string,></string,></string,></string,></string,></string,></string,></string,>前台页面
123<%@
page language="java"
contentType="text/html;
charset=UTF-8"pageEncoding="UTF-8"%><%@ include file="../../common/meta.jsp"%> <script src="${jqueryCtxPath }/jquery-ui-1.11.2.custom/jquery-ui.min.js"></script>
普通的异常处理测试网络连接异常的Ajax测试
普通异常的Ajax测试<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>页面结果演示

springmvc 统一处理异常的更多相关文章
- SpringMVC第六篇【校验、统一处理异常】
Validation 在我们的Struts2中,我们是继承ActionSupport来实现校验的-它有两种方式来实现校验的功能 手写代码 XML配置 这两种方式也是可以特定处理方法或者整个Action ...
- SpringMVC【校验器、统一处理异常、RESTful、拦截器】
前言 本博文主要讲解的知识点如下: 校验器 统一处理异常 RESTful 拦截器 Validation 在我们的Struts2中,我们是继承ActionSupport来实现校验的...它有两种方式来实 ...
- springmvc请求参数异常统一处理,结合钉钉报告信息定位bug位置
参考之前一篇博客:springmvc请求参数异常统一处理 1.ExceptionHandlerController package com.oy.controller; import java.tex ...
- springmvc shiro UnauthorizedException 异常解决方案
springMVC 整合 shiro 时,配置了当访问某个URL没有权限时的配置处理: <!-- 通过unauthorizedUrl指定没有权限操作时跳转页面 --><propert ...
- Java springmvc 统一异常处理的方案
前言:为什么要统一异常处理?经常在项目中需要统一处理异常,将异常封装转给前端.也有时需要在项目中统一处理异常后,记录异常日志,做一下统一处理. Springmvc 异常统一处理的方式有三种. 一.使用 ...
- (转)SpringMVC学习(八)——SpringMVC中的异常处理器
http://blog.csdn.net/yerenyuan_pku/article/details/72511891 SpringMVC在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常 ...
- SpringMVC实现全局异常处理器 (转)
出处: SpringMVC实现全局异常处理器 我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手 ...
- 13.SpringMVC之全局异常
我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生.在开发中,不管是dao层 ...
- SpringBoot统一处理异常
在springboot项目,报错有着默认的提示,这篇文章介绍一下如何统一处理异常. 新建项目,pom文件如下: <?xml version="1.0" encoding=&q ...
随机推荐
- Java安全之JNI绕过RASP
Java安全之JNI绕过RASP 0x00 前言 前面一直想看该JNI的相关内容,但是发现JNI的资料还是偏少.后面发现JNI在安全中应用非常的微妙,有意思. 0x01 JNI概述 JNI的全称叫做( ...
- CBV装饰校验的三种方式session
代码如下: from django.shortcuts import render,HttpResponse,redirect from django.views import View # Crea ...
- 【NOIP2017提高A组模拟9.17】猫
[NOIP2017提高A组模拟9.17]猫 题目 Description 信息组最近猫成灾了! 隔壁物理组也拿猫没办法. 信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数) ...
- 基础篇:异步编程不会?我教你啊!CompeletableFuture
前言 以前需要异步执行一个任务时,一般是用Thread或者线程池Executor去创建.如果需要返回值,则是调用Executor.submit获取Future.但是多个线程存在依赖组合,我们又能怎么办 ...
- CoProcessFunction实战三部曲之三:定时器和侧输出
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- moviepy音视频剪辑VideoClip类set_position方法pos参数的使用方法及作用
☞ ░ 前往老猿Python博文目录 ░ moviepy音视频剪辑VideoClip类set_position方法用于多个剪辑合成一个剪辑时设置调用剪辑实例的拷贝在合成剪辑的位置. 调用语法: set ...
- Python使用property函数定义属性访问方法如果不定义fget会怎么样?
我们知道Python使用property函数定义属性访问方法时的语法如下: 实例属性=property(fget=None, fset=None, fdel=None, doc=None) 而是要@p ...
- 转:Cookie详解
没怎么坐过客户端相关的工作,所以写爬虫的时候,很多概念都很模糊,学习起来很困难.现在想攻坚一下,所以找了一下cookies相关的内容. HTTP cookies,通常又称作"cookies& ...
- PyQt(Python+Qt)学习随笔:QHeaderView.ResizeMode取值及含义
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 关于ResizeMode的使用请参考<PyQt(Python+Qt)学习随笔:QTableWi ...
- 【题解】AcWing 193. 算乘方的牛
原题链接 题目描述 约翰的奶牛希望能够非常快速地计算一个数字的整数幂P(1 <= P <= 20,000)是多少,这需要你的帮助. 在它们计算得到最终结果的过程中只能保留两个工作变量用于中 ...