zoukankan      html  css  js  c++  java
  • 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)使被其注解的方法在发生异常时执行

  • 相关阅读:
    常用的网址
    Powerdesigner使用建议(完整版)
    非常实用的钩子程序(c++).
    SQLPlus中的复制和粘贴技巧 http://www.oradb.net/sql/sqlplus_007.htm
    【C#】输出的XML文件中空标签多换行符
    CMD创建当前日期文件夹
    【PostgreSQL】Select取得行号
    職業定義
    【SQLSERVER】CMD执行SQL语句
    【Oracle】PACKAGE输出LOG文件
  • 原文地址:https://www.cnblogs.com/naixin007/p/10295553.html
Copyright © 2011-2022 走看看