问题描述:当最外层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= [%-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
情景二:前后端分离,出现异常时json格式不再标准。
为了便于前后端分离开发,我们创建一个类集中处理异常 在controller包下创建公共异常处理类BaseExceptionHandler,使异常结果也标准化
package com.tenpower.base.controller; import entity.Result; import entity.StatusCode; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; /** * @Description 公共异常处理类 * @Author bofeng * @Version 1.0 */ @ControllerAdvice //作为所有Controller的切点 public class BaseExceptionHandler { @ExceptionHandler(Exception.class) @ResponseBody public Result error(Exception e) { e.printStackTrace(); return new Result(false, StatusCode.ERROR, e.getMessage()); } }
其中@ControllerAdvice使Controller中所有注解了@RequestMapping的方法都要执行本类下的方法,
@ExceptionHandler(Exception.class)使被其注解的方法在发生异常时执行