SpringMVC全局异常处理

问题描述:当最外层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)使被其注解的方法在发生异常时执行

原文地址:https://www.cnblogs.com/naixin007/p/10295553.html