1.自定义统一异常处理器

自定义Exception实现 HandlerExceptionResolver接口或继承AbstractHandlerExceptionResolver类

1.实现接口HandlerExceptionResolver

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package

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

ExceptionHandler
implements

HandlerExceptionResolver {
    private

static

final

Logger LOGGER = Logger
        .getLogger(ExceptionHandler.class);
 
    @Override
    public

ModelAndView resolveException(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");
    }
 
}

2.继承AbstractHandlerExceptionResolver类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package

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

ExceptionHandler
extends

AbstractHandlerExceptionResolver{
    private

static

final

Logger LOGGER = Logger
        .getLogger(ExceptionHandler.class);
 
    @Override
    protected

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
 

在配置文件中添加自定义异常处理模块

?
1
2
<!--
Spring MVC的统一异常处理 -->
   <bean
class="com.jay.platform.exception.handler.ExceptionHandler"

id=
"exceptionResolver"
</bean>

错误页面展示:

error.jsp

?
1
2
<%@
page language=
"java"

contentType=
"text/html;
charset=UTF-8"
    pageEncoding="UTF-8"%>

Error页面

出错信息

错误描述

${errorTips }







错误异常信息栈



${ex }




eception.jsp

?
1
2
<%@
page language=
"java"

contentType=
"text/html;
charset=UTF-8"
    pageEncoding="UTF-8"%>

Exception页面

模块开发中,请稍后。。。。。。

2.基于@ControllerAdvice注解实现统一异常处理,可方便返回普通异常和Ajax异常信息

自定义Web层异常处理

WebExceptionHandler.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package

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
 *
 */
@ControllerAdvice
public

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,网络连接出错!!!");
    }
}

异常测试

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package

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)
    @ResponseBody
    public

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)
    @ResponseBody
    public

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,>

前台页面

?
1
2
3
<%@
page language=
"java"

contentType=
"text/html;
charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@
taglib prefix=
"c"

uri=
"http://java.sun.com/jsp/jstl/core"%>

<%@ 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 统一处理异常的更多相关文章

  1. SpringMVC第六篇【校验、统一处理异常】

    Validation 在我们的Struts2中,我们是继承ActionSupport来实现校验的-它有两种方式来实现校验的功能 手写代码 XML配置 这两种方式也是可以特定处理方法或者整个Action ...

  2. SpringMVC【校验器、统一处理异常、RESTful、拦截器】

    前言 本博文主要讲解的知识点如下: 校验器 统一处理异常 RESTful 拦截器 Validation 在我们的Struts2中,我们是继承ActionSupport来实现校验的...它有两种方式来实 ...

  3. springmvc请求参数异常统一处理,结合钉钉报告信息定位bug位置

    参考之前一篇博客:springmvc请求参数异常统一处理 1.ExceptionHandlerController package com.oy.controller; import java.tex ...

  4. springmvc shiro UnauthorizedException 异常解决方案

    springMVC 整合 shiro 时,配置了当访问某个URL没有权限时的配置处理: <!-- 通过unauthorizedUrl指定没有权限操作时跳转页面 --><propert ...

  5. Java springmvc 统一异常处理的方案

    前言:为什么要统一异常处理?经常在项目中需要统一处理异常,将异常封装转给前端.也有时需要在项目中统一处理异常后,记录异常日志,做一下统一处理. Springmvc 异常统一处理的方式有三种. 一.使用 ...

  6. (转)SpringMVC学习(八)——SpringMVC中的异常处理器

    http://blog.csdn.net/yerenyuan_pku/article/details/72511891 SpringMVC在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常 ...

  7. SpringMVC实现全局异常处理器 (转)

    出处:  SpringMVC实现全局异常处理器 我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手 ...

  8. 13.SpringMVC之全局异常

    我们知道,系统中异常包括:编译时异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发.测试通过手段减少运行时异常的发生.在开发中,不管是dao层 ...

  9. SpringBoot统一处理异常

    在springboot项目,报错有着默认的提示,这篇文章介绍一下如何统一处理异常. 新建项目,pom文件如下: <?xml version="1.0" encoding=&q ...

随机推荐

  1. linux查看内存及磁盘使用情况

    1.查看当前目录 命令:   df -h       (统一每个目录下磁盘的整体情况) 2.查看指定目录 在命令后直接放目录名,比如查看"usr"目录使用情况: 命令:   df ...

  2. 网络拓扑实例10:MSTP+VRRP组合组网

    组网图形 MSTP+VRRP组合简介 网络中部署VRRP负载分担时,多台设备同时承担业务,每个虚拟设备都包括一个Master设备和若干个Backup设备.如果为了接入备份需要同时部署冗余链路,则需要部 ...

  3. python核心高级学习总结3-------python实现进程的三种方式及其区别

    python实现进程的三种方式及其区别 在python中有三种方式用于实现进程 多进程中, 每个进程中所有数据( 包括全局变量) 都各有拥有⼀份, 互不影响 1.fork()方法 ret = os.f ...

  4. Python函数的关键字参数

    除了位置参数的函数参数使用方式,还有一种在函数调用时指定形参等于指定实参的参数使用模式,该模式称为关键字参数.关键字参数使用可以不按形参的顺序传递实参,系统按形参的名字确认实参传递给哪个参数. 具体内 ...

  5. PyQt(Python+Qt)学习随笔:QTableWidget的takeItem和sortItems方法

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget中的takeItem方法从表格中取并去除项,sortItems方法对表格中的 ...

  6. HTTP接口传输数据常用的方式

    Get方式是从服务器上获取数据,在数据查询时,建议用Get方式:如商品信息接口.搜索接口等 Post方式是向服务器传送数据,做数据添加.修改或删除时,建议用Post方式,如登录注册接口等. 1.GET ...

  7. GBK宽字节注入SQL

    SQL注入:宽字节注入(GBK双字节绕过) 2015-06-09lyiang 宽字节注入的作用是非常大的,实际上在代码层的防御一般不外乎两种,一是反斜杠转义,而就是replace替换成空字节,之前的替 ...

  8. 代码审计【根据功能点定向审计】BugFree ZSWin重装案例

    (哦对了!这些CMS代码不要安装在服务器上,先不说它们用来代码审计本身就是有漏洞的,而且在网上下载下来,也不能保证没有源码是否被篡改而留有后门,就安装在本地进行代码审计的练习即可) 我们先下载BugF ...

  9. python zip()函数用法

    zip() --内建函数 zip([iterable, ...]) 它接受一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些tuples组成的list(列表) ...

  10. SQL数据库优化的六种方法

    SQL命令因为语法简单.操作高效受到了很多用户的欢迎.但是,SQL命令的效率受到不同的数据库功能的限制,特别是在计算时间方面,再加上语言的高效率也不意味着优化会更容易,所以每个数据库都需要依据实际情况 ...