springboot(2.2.4)全局异常处理(RestControllerAdvice,ExceptionHandler)

当程序出现异常我们一般try,catch处理,这样代码结构不好看,我们希望程序员写的代码业务和框架是分离的,通过注解进行绑定使用。springboot里通过@RestControllerAdvice注解定义全局异常处理类,通过@ExceptionHandler(异常类型.class)拦截对应的异常。

我希望实现的是,前台发出请求,如果后台发生异常,后台把异常信息输出到日志,返回给前台500错误码和我们自定义的错误message而不是返回整个错误堆栈给前台,虽然前段框架比如Vue、React等有自己的请求返回数据结构,但是如果发生异常还是会得到整个堆栈信息,对客户不友好,当然我们前台也可以对这些异常进行处理进而给用户比较友好的界面,但是后台的错误应该由后台处理较合适。比较适用于前后端分离的架构。代码如下:

package com.example.demo.exception;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.util.Constant;

/**
 * @author lijinfei
 * @Desc
 * @date 2020/3/26 14:45 Version: 1.0
 */
@RestControllerAdvice
public class ExceptionHandler {

    private static final Logger logger = LogManager.getLogger(ExceptionHandler.class);
    private static final String ERROR_MESSAGE = "后台跑丢了,sorry";

    @org.springframework.web.bind.annotation.ExceptionHandler(Exception.class)
    public Object handlerException(Exception e) {
        // 返回给前台
        JSONObject jsonObject = new JSONObject();
        jsonObject.put(Constant.STATUS, 500);
        jsonObject.put(Constant.MESSAGE, ERROR_MESSAGE);
        // 日志记录错误,包括堆栈信息
        logger.error(e.getMessage(), e);
        return jsonObject;
    }

    // 这个异常ArithmeticException粒度小于Exception,如果发生这个异常,则被此方法拦截
   //@org.springframework.web.bind.annotation.ExceptionHandler(ArithmeticException.class)
    // public Object handArithmeticException(Exception e) {
    // JSONObject jsonObject = new JSONObject();
    // jsonObject.put(Constant.STATUS, 501);
    // jsonObject.put(Constant.MESSAGE, e.getMessage());
    // logger.error(e.getMessage(), e);
    // return jsonObject;
    // }
}

注释掉的这个拦截ArithmeticException异常的方法,如果发生ArithmeticException,会使用这个方法处理,因为ArithmeticException粒度小于Exception。我们可以定义各种各样的异常拦截,比如空指针、参数错误、数学异常等很多的RuntimeException,也可以自定义异常类进行拦截。我感觉没有必要, 当异常发生后真正有用的信息是堆栈信息,所以只需要一个总得Exception就够了,把堆栈信息写到日志里便于跟踪定位就行。欢迎批评指正。

猜你喜欢

转载自blog.csdn.net/weixin_39370859/article/details/105119625