Bootstrap

SpringBoot(三十五)SpringBoot自定义全局异常处理类

这里呢,我自定义一个全局异常处理类,我在程序编写中,难免会有异常发生,这对我们的生产环境就不是很友好。

前端调用接口,正常我返回的事json,但是抛出异常就是死给前端看了,这就不是很友好。

SpringBoot框架对异常的处理提供了几种很强大的方法,我们可以通过@ControllerAdvice和@ExceptionHandler注解实现全局异常的处理

一:引入lombok依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

二:自定义异常类

package com.modules.exception;

/**
 * 自定义service异常类
 */
public class ServiceException extends RuntimeException
{
    private Integer code;

    public Integer getCode()
    {
        return code;
    }

    public ServiceException(String message, Integer code)
    {
        super(message);
        this.code = code;
    }
}

调用:

throw new ServiceException("测试异常",111);

三:全局异常处理类

我这里写的比较简单,有需要,大家自己再添加对应的处理。

package com.modules.exception;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * 自定义全局异常处理
 */
@RestControllerAdvice
@Slf4j
public class GlobalException
{
    /**
     * Exception 异常
     * @param request
     * @param e
     * @return
     */
    @ExceptionHandler(value = {Exception.class})
    public Map<String, Object> exceptionHandler(HttpServletRequest request, Exception e)
    {
        log.info("未知异常,请求地址:{},错误信息:{}", request.getRequestURI(), e.getMessage());
        Map<String, Object> map = new HashMap<>();
        map.put("code", 999);
        map.put("message", e.getMessage());
        return map;
    }

    /**
     * Runtime异常
     * @param request
     * @param e
     * @return
     */
    @ExceptionHandler(value = {RuntimeException.class})
    public Map<String, Object> runtimeHandler(HttpServletRequest request, RuntimeException e)
    {
        log.info("Runtime异常,请求地址:{},错误信息:{}", request.getRequestURI(), e.getMessage());
        Map<String, Object> map = new HashMap<>();
        map.put("code", 888);
        map.put("message", e.getMessage());
        return map;
    }

    /**
     * 自定义异常 处理
     * @param request
     * @param e
     * @return
     */
    @ExceptionHandler(value = {ServiceException.class})
    public Map<String, Object> serviceExceptionHandler(HttpServletRequest request, ServiceException e)
    {
        log.info("自定义异常,请求地址:{},错误信息:{}", request.getRequestURI(), e.getMessage());
        Map<String, Object> map = new HashMap<>();
        map.put("code", e.getCode());
        map.put("message", e.getMessage());
        return map;
    }

    /**
     * 空指针异常 处理
     * @param request
     * @param e
     * @return
     */
    @ExceptionHandler(value = {NullPointerException.class})
    public Map<String, Object> nullPointExceptionHandler(HttpServletRequest request, NullPointerException e)
    {
        log.info("空指针异常,请求地址:{},错误信息:{}", request.getRequestURI(), e.getMessage());
        Map<String, Object> map = new HashMap<>();
        map.put("code", 500);
        map.put("message", e.getMessage());
        return map;
    }
}

这个只要抛出异常,就会捕获到。

这里要着重说一下我上边使用的@RestControllerAdvice注解:@RestControllerAdvice是一个组合注解,由@ControllerAdvice、@ResponseBody组成,而@ControllerAdvice继承了@Component,因此@RestControllerAdvice本质上是个Component。

用着是真方便。

我这个就是简单的编写了一个自定义异常了和定义了一个简单的全局异常处理类。

功能相对比较单一。在正常业务中使用可能还需要扩展更多的功能。

有好的建议,请在下方输入你的评论。

;