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=\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

情景二:前后端分离,出现异常时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)使被其注解的方法在发生异常时执行

优质内容筛选与推荐>>
1、Reveal查看任意app的高级技巧
2、Miller_Rabin测试法
3、☀【CSS3】阴影 box-shadow
4、HDU 3311 Dig The Wells
5、西子晴雪。


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn