对于异常处理,大多使用一个共同的异常类统一处理从dao,service,controller层抛出的异常,将页面跳转到共同的error页面。
public class CommonException implements HandlerExceptionResolver { /** 日志 **/ private Logger logger = LoggerFactory.getLogger(CommonException.class); /** 共同error处理页面 **/ private static final String COMMON_ERROR_PAGE = "/error/error"; /** 共同session超时处理页面 **/ private static final String COMMON_SESSION_PAGE = "/error/session"; /** * 异常类的统一处理 */ @Override public ModelAndView resolveException(HttpServletRequest req, HttpServletResponse resp, Object obj, Exception e) { logger.debug(">>>resolveException(HttpServletRequest req, HttpServletResponse resp, Object obj,Exception e)"); ModelAndView mav = new ModelAndView(); // 默认error处理 mav.addObject("errorMsg", "数据处理异常,请重试或与管理员联系!"); mav.addObject("errorDetailMsg", e.getMessage()); mav.addObject("errorDetailCause", e.getCause()); mav.setViewName(COMMON_ERROR_PAGE); // session超时处理 if(e instanceof SessionException) { mav.addObject("errorMsg", "您因长时未操作会话超时,请点击【确定】,重新登录!"); mav.addObject("errorDetailMsg", (SessionException) e).getMsg()); mav.setViewName(COMMON_SESSION_PAGE); } logger.debug("<<<resolveException(HttpServletRequest req, HttpServletResponse resp, Object obj,Exception e)"); return mav; }
注意需要实现 HandlerExceptionResolver 这个接口。
同时注册bean.
<bean class="com.****.CommonException"></bean>
统一异常处理拦截:
** * description: 统一异常处理 * * @Autor:DennyZhao * @Date:2019/8/26 * @Version: 1.0.0 */ @ControllerAdvice public class ApiExceptionHandler { /** 共同log信息 **/ protected final Logger logger = LoggerFactory.getLogger(ApiExceptionHandler.class); @ExceptionHandler() @ResponseBody String handleException(Exception e){ logger.error("未知异常", e); return ScsErrorCode.ERROR_CODE_SCS_EP9999 + "出现未知异常," + e.getMessage(); } }