利用Spring进行统一异常处理的两种方式

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

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

1.实现接口HandlerExceptionResolver

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类


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) {
	<pre name="code" class="java">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");
}}
 
 
在配置文件中添加自定义异常处理模块
 <!-- Spring MVC的统一异常处理 -->
    <bean id="exceptionResolver" class="com.jay.platform.exception.handler.ExceptionHandler"/>  



错误页面展示:

error.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>
<center>
<h1>Error页面</h1><br>
<h2>出错信息</h2>
<br><br>
错误描述
<br>
${errorTips }
<br><br>
<br><br>
错误异常信息栈
<br><br>
${ex }
</center>
</body>
</html>


eception.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>Exception页面</title>
</head>
<body>
<center>
<h1>Exception页面</h1><br>
<h2>模块开发中,请稍后。。。。。。</h2>
</center>
</body>
</html>





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

自定义Web层异常处理


WebExceptionHandler.java

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/unau
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值