问题描述: 当最外层 Controller 向外抛出异常, 会导致页面直接显示异常信息, 造成不友好的用户体验
处理思路:
一, 配置 log4j
● 导入 log4j 和 slf4j 的依赖: slf4f 是所有日志处理的的规范, 推荐用 slf4j 操作 (导入 org.slf4j)
- <!-- 日志处理 -->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-log4j12</artifactId>
- <version>${slf4j.version}</version>
- </dependency>
● 将 log4j.properties 文件放入 resources 目录
- log4j.rootLogger=INFO,A3,STDOUT
- log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
- log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
- log4j.appender.STDOUT.layout.ConversionPattern=[%p] [%l] %10.10c - %m%n
- log4j.appender.A3=org.apache.log4j.RollingFileAppender
- log4j.appender.A3.file=logs/server.log
- log4j.appender.A3.MaxFileSize=1024KB
- log4j.appender.A3.MaxBackupIndex=10
- log4j.appender.A3.layout=org.apache.log4j.PatternLayout
- log4j.appender.A3.layout.ConversionPattern=\n\n[%-5p] %d{
- yyyy-MM-dd HH\:mm\:ss,SSS
- } method\:%l%n%m%n
二, 继承 HandlerExceptionResolver 来处理异常
- package cn.e3mall.search.exception;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.web.servlet.HandlerExceptionResolver;
- import org.springframework.Web.servlet.ModelAndView;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class GlobalExceptionResolver implements HandlerExceptionResolver {
- private static final Logger LOGGER = LoggerFactory.getLogger(GlobalExceptionResolver.class);
- @Override
- public ModelAndView resolveException(HttpServletRequest httpServletRequest,
- HttpServletResponse httpServletResponse, Object o, Exception e) {
- // 打印控制台
- e.printStackTrace();
- // 写日志
- LOGGER.error("系统发生异常",e);
- // 发邮件通知开发人员 debug
- //TODO
- // 显示错误页面
- ModelAndView modelAndView = new ModelAndView();
- modelAndView.setViewName("error/exception");
- return modelAndView;
- }
- }
三, 在 springmvc 配置全局异常处理器
- <!-- 配置全局异常处理器 -->
- <bean class="cn.e3mall.search.exception.GlobalExceptionResolver"/>
四, 测试异常处理
在 Controller 加入如下代码
int i = 1/0;
搜索结果展示错误页面 exception.jsp
[ERROR] 2019-01-20 17:18:38,634 method:cn.e3mall.search.exception.GlobalExceptionResolver.resolveException(GlobalExceptionResolver.java:21)
系统发生异常
java.lang.ArithmeticException: / by zero
来源: http://www.bubuko.com/infodetail-2927929.html