版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fanxing1964/article/details/82315033
1,重写HandlerExceptionResolver接口的resolveException方法做一个全局的异常处理(基于spring mvc)
不同于继承Exception按照业务自定义一个异常,这种方法作用范围更大,在Controller层通过throws把异常抛出来,交给spring mvc来处理,重写的方法里判断异常类型(当然这些异常类型也可以是我们自定义的)进而做出处理。
全局处理异常类
public class ExceptionHandler implements HandlerExceptionResolver,Ordered {
private static Logger logger = Logger.getLogger(ExceptionHandler.class);
private static Integer order = Integer.MIN_VALUE;
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,
Object handler, Exception e) {
logger.error("异常请求URL:" + httpServletRequest.getRequestURL());
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
logger.warn("处理器的方法为:" + method.getName());
}
logger.error("异常栈 ==>> ");
logger.error(ExceptionUtils.parseException(e));
if (e instanceof NoHandlerFoundException){
responseJson(httpServletResponse,"请求的页面不存在");
return new ModelAndView((String) null);
} else if(e instanceof ServletException){
responseJson(httpServletResponse,e.getMessage());
return new ModelAndView((String) null);
}
else if (e instanceof PermissionDefineException){
responseJson(httpServletResponse, "您没有权限进行该操作");
return new ModelAndView((String) null);
}
else if (e instanceof BaseException) {
responseJson(httpServletResponse, "数据异常~ 请稍后再试");
return new ModelAndView((String) null);
}else {
responseJson(httpServletResponse, "服务器异常~ 请稍后再试");
return new ModelAndView((String) null);
}
}
private void responseJson(HttpServletResponse response,String content){
response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
ApiResponseBean respBean = ApiResponseBuilder.buildResponse(-1,content);
PrintWriter out =null;
try {
out = response.getWriter();
out.write(JsonUtils.toJSONString(respBean));
out.flush();
out.close();
} catch (IOException e) {
logger.error(ExceptionUtils.parseException(e));
}finally {
if(out!=null){
out.close();
}
}
};
@Override
public int getOrder() {
return order;
}
}
加入xml文件
<!--定义全局异常处理-->
<bean class="com.uiao.web.exception.ExceptionHandler"/>
另外:spring boot也支持注解的异常处理,后续补上。
2,在web.xml里配置(基于spring mvc)
其实这个不能算是异常处理,因为不涉及异常的一些捕获抛出,所有流程都是正常执行的,只是对最后结果做一个再处理。
<error-page>
<error-code>404</error-code>
<location>/notFound</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/sysError</location>
</error-page>
异常结果处理类
@Controller
public class ExceptionController {
@RequestMapping("notFound")
@ResponseBody
public Map<String,Object> processNotFountException(){
return Tools.getApiResponse(1,"页面未找到,请检查路径是否正确");
}
@RequestMapping("sysError")
@ResponseBody
public Map<String,Object> processException(){
return Tools.getApiResponse(1,"数据异常,请稍后再试");
}
}
这样可以给前端返回一些具体的提示。