参考博文: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<String, Object> map = new HashMap<String, Object>();
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<String, Object> map = new HashMap<String, Object>();
// 如果是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加载
<!-- 异常处理类 -->
<bean id="exceptionResolver" class="com.hongao.agent.common.AgentExceptionResolver"></bean>
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+"/";
%>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="zh-cmn">
<head>
</head>
<body>
<div class="s_main_wrap s_no_top nicescroll">
<div class="s_main_fixed_bg"></div>
<div class="s_main">
<div class="s_header_title">
<span class="s_header_left">
<a href="#" οnclick=(history.back())><i class="icon iconfont"></i></a>
</span>
<span class="s_f18">错误消息</span>
</div>
<!-- end header title -->
<h1>抱 歉!</h1>
<div style="padding:2% 0;text-indent:2em;">尊敬的用户:我们致力于提供更好的服务,但人算不如天算,有些错误发生了,希望是在控制的范围内……如果问题重复出现,请向系统管理员反馈。</div>
错误详情:<%= exception.getMessage() %>
</div>
<%-- <div>
<center>
<a href="${pageContext.request.contextPath}">回首页</a> | <a href="javascript:history.go(-1);">上一页</a>
</center>
</div> --%>
</div>
<!-- end main -->
</body>
</html>
测试:
throw new HaBizException("XXXX");
可以在web.xml配置400、500的错误,有错误页面处理