springboot 全局异常处理 自定义异常

本文介绍了如何在Spring Boot中实现全局异常处理,避免Controller层充斥着try-catch块。通过创建一个`ExceptionHandlerAdvice`类,捕获并统一处理各种异常,包括自定义的`SunFlowerException`,提供了一种优雅的方式来管理错误返回,简化了代码并提高了可维护性。
摘要由CSDN通过智能技术生成

文章积累知识,如有存在问题,请大家不啬赐教 

前文:之前写了一篇浅谈代码规范的文章,文章地址:https://blog.csdn.net/tang_sy/article/details/115002158

看官会觉得controller满屏的try-catch,似乎心情会不爽,想到能不能全局处理异常,不再是service抛出异常,controller处理异常,也就是说开发者不关注异常处理,自定义异常直接在service抛出

 

我从来没见过这么嚣张的人,哎!你今天就见到了

package com.hzw.sunflower.common;

import com.hzw.sunflower.constant.GeneralConstants;
import com.hzw.sunflower.constant.MessageConstants;
import com.hzw.sunflower.exception.SunFlowerException;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.ResourceNotFoundException;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;

/**
 * 统一异常处理类
 *
 * @author YHD
 * @version 1.0.0 2021-03-31
 */
@Slf4j
@RestControllerAdvice
public class ExceptionHandlerAdvice {

    /**
     * 底层的全局异常处理方法
     *
     * @param e Throwable
     * @return 异常结果数据
     */
    @ExceptionHandler(Throwable.class)
    public Result<?> throwableErrorHandler(Throwable e) {
        log.error(e.getMessage(), e);
        return Result.error(e.getMessage(), e);
    }

    /**
     * 默认的全局异常处理方法
     *
     * @param e Exception
     * @return 异常结果数据
     */
    @ExceptionHandler(Exception.class)
    public Result<?> defaultErrorHandler(Exception e) {
        log.error(e.getMessage(), e);
        return Result.error(e.getMessage(), e);
    }

    /**
     * 运行时异常处理方法
     *
     * @param e RuntimeException
     * @return 异常结果数据
     */
    @ExceptionHandler(RuntimeException.class)
    public Result<?> runtimeExceptionHandler(RuntimeException e) {
        log.error(e.getMessage(), e);
        return Result.error(MessageConstants.MESSAGE_SERVER_ERROR, e);
    }

    /**
     * Bean Validation字段验证的异常处理方法
     *
     * @param e MethodArgumentNotValidException
     * @return 异常结果数据
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<?> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        return Result.failed(e.getBindingResult().getFieldError().getDefaultMessage());
    }

    /**
     * Bean Validation字段验证的异常处理方法
     *
     * @param e BindException
     * @return 异常结果数据
     */
    @ExceptionHandler(BindException.class)
    public Result<?> bindExceptionHandler(BindException e) {
        return Result.failed(e.getBindingResult().getFieldError().getDefaultMessage());
    }


    @ExceptionHandler(SunFlowerException.class)
    public Result<?> bindExceptionHandler(SunFlowerException e) {
        return Result.errorCode(e.getExceptionEnum().getCode(), e.getExceptionEnum().getMessage(), e);
    }


    /**
     * 上传文件的总大小超过maxUploadSize配置的大小时的异常处理方法
     *
     * @param e MaxUploadSizeExceededException
     * @return 异常结果数据
     */
    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public Result<?> maxUploadSizeExceededException(MaxUploadSizeExceededException e) {
        long size = e.getMaxUploadSize() / GeneralConstants.FILE_SIZE / GeneralConstants.FILE_SIZE;
        return Result.failed(MessageConstants.UPLOAD_TOO_LARGE + size + MessageConstants.FILE_UNIT_M);
    }

    /**
     * 获取路径错误
     *
     * @param e
     * @return
     */
    @ExceptionHandler(ResourceNotFoundException.class)
    public Result<?> resourceNotFoundException(ResourceNotFoundException e) {
        return Result.failed(MessageConstants.NOT_FOUND, e.getMessage());
    }

}
SunFlowerException是项目自定义异常,可参照开头文章地址查看,这样就完美解决controller补货并处理异常,统一处理是不是很方便
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值