Javaweb异常统一处理

参考博文:https://www.cnblogs.com/andy-zhou/p/5317820.html

https://jingyan.baidu.com/article/d3b74d64cb430b1f77e60939.html

1、异常处理器

package com.hongao.agent.common;

import java.util.HashMap;
import java.util.Map;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.druid.support.json.JSONUtils;
import com.hongao.agent.consts.ErrorMessage;
import com.hongao.agent.consts.OssRespCodes;
import com.hongao.parent.exception.HaBizException;
import com.hongao.parent.exception.HaRtException;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerExceptionResolver;

/**
* @author eadela 
* @date 2017年12月18日 上午11:45:42
* @desc 异常处理器
*/
public class AgentExceptionResolver implements HandlerExceptionResolver {
	
	private final Logger logger = LoggerFactory.getLogger(getClass());
	
	@Override
	public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object object, Exception exception) {
		// 判断是否ajax请求
        if (!(request.getHeader("accept").indexOf("application/json") > -1 || (request
                .getHeader("X-Requested-With") != null && request.getHeader(
                "X-Requested-With").indexOf("XMLHttpRequest") > -1))) {
            // 如果不是ajax,JSP格式返回
            // 为安全起见,只有业务异常我们对前端可见,否则否则统一归为系统异常
            Map map = new HashMap();
            map.put("success", false);
            if (exception instanceof HaBizException) {
                map.put(OssRespCodes.ERROR_MSG, exception.getMessage());
                logger.error("show business exception:{}", exception.getMessage());
            } else if (exception instanceof HaRtException) {
                map.put(OssRespCodes.ERROR_MSG, exception.getMessage());
                logger.error("show runtime exception:{}", exception.getMessage());
            } else {
                map.put(OssRespCodes.ERROR_MSG, ErrorMessage.SYS_EXCEPTION);
                logger.error("show exception:{}", ErrorMessage.SYS_EXCEPTION);
            }
            //对于非ajax请求,我们都统一跳转到error.jsp页面
            return new ModelAndView("error", map);
        } else {
        	Map map = new HashMap();
            // 如果是ajax请求,JSON格式返回
            try {
                response.setContentType("application/json;charset=UTF-8");
                PrintWriter writer = response.getWriter();
                
                map.put("success", false);
                // 为安全起见,只有业务异常我们对前端可见,否则统一归为系统异常
                if (exception instanceof HaBizException) {
                    map.put(OssRespCodes.ERROR_MSG, exception.getMessage());
                    logger.error("show business exception:{}",exception.getMessage());
                } else if (exception instanceof HaRtException) {
                    map.put(OssRespCodes.ERROR_MSG, exception.getMessage());
                    logger.error("show runtime exception:{}", exception.getMessage());
                } else {
                    map.put(OssRespCodes.ERROR_MSG, ErrorMessage.SYS_EXCEPTION);
                    logger.error("show exception:{}",ErrorMessage.SYS_EXCEPTION);
                }
                writer.write(JSONUtils.toJSONString(map));
                writer.flush();
                writer.close();
                return new ModelAndView("error");
            } catch (IOException e) {
            	logger.error("show exception error:{}",e.getMessage());
                map.put(OssRespCodes.ERROR_MSG, ErrorMessage.SYS_EXCEPTION);
                //异常中的异常返回到错误页面
                return new ModelAndView("error", map);
            }
        }
	}

}
2、spring-mvc.xml加载


3、错误页面

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" isErrorPage="true"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>




  


错误消息

抱 歉!

尊敬的用户:我们致力于提供更好的服务,但人算不如天算,有些错误发生了,希望是在控制的范围内……如果问题重复出现,请向系统管理员反馈。
错误详情:<%= exception.getMessage() %>
<%-- --%>
测试:

throw new HaBizException("XXXX");

可以在web.xml配置400、500的错误,有错误页面处理


你可能感兴趣的:(java,exception)