全局异常捕获自定义错误返回提示信息

本文详细介绍了如何在SpringBoot中优化全局异常处理,通过修改控制器建议类,自定义异常处理逻辑,使得返回的错误信息更加清晰明确,提高用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常规的全局异常捕获代码

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 全局异常捕获处理
 */
@ControllerAdvice
public class MyExceptionHandler {
    /**
     * 统一异常处理
     *
     * @param e
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public ResponseMessage errorHandler(Exception e) {
        e.printStackTrace();
        return ResponseMessage.error(10086, e.getMessage());
    }

    /**
     * 自定义异常的处理
     *
     * @param e
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = RRException.class)
    public ResponseMessage myErrorHandler(RRException e) {
        e.printStackTrace();
        return ResponseMessage.error(e.getCode(), e.getMsg());
    }

}

存在的问题

此时,如果出现异常,返回的信息如下:

{
  "message": "Validation failed for argument [0] in public com.schdri.bimgis.road.domain.common.entity.ResponseMessage<com.schdri.bimgis.road.service.vo.organization.OrganizationVo> com.schdri.bimgis.road.domain.controller.OrganizationController.update(com.schdri.bimgis.road.service.vo.organization.OrganizationVo): [Field error in object 'organizationVo' on field '_id': rejected value [null]; codes [NotNull.organizationVo._id,NotNull._id,NotNull.java.lang.String,NotNull]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [organizationVo._id,_id]; arguments []; default message [_id]]; default message [id不能为空!]] ",
  "result": null,
  "status": 500,
  "timestamp": 1599644944593,
  "code": null,
  "includes": null,
  "excludes": null
}

显然,请求响应的提示信息不是我们想要的。

修改后的代码

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import org.springframework.web.util.WebUtils;

/**
 * 全局异常捕获处理
 */
@ControllerAdvice
public class MyExceptionHandler extends ResponseEntityExceptionHandler {
    /**
     * 统一异常处理
     *
     * @param e
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public ResponseMessage errorHandler(Exception e) {
        e.printStackTrace();
        return ResponseMessage.error(10086, e.getMessage());
    }

    /**
     * 自定义异常的处理
     *
     * @param e
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = RRException.class)
    public ResponseMessage myErrorHandler(RRException e) {
        e.printStackTrace();
        return ResponseMessage.error(e.getCode(), e.getMsg());
    }

    /**
     * 自定义所有异常类型的响应主体
     *
     * @param ex      异常
     * @param body    响应主体
     * @param headers 响应头
     * @param status  响应状态
     * @param request 当前请求
     * @return
     */
    @Override
    protected ResponseEntity<Object> handleExceptionInternal(Exception ex, Object body, HttpHeaders headers, HttpStatus status, WebRequest request) {
        if (HttpStatus.INTERNAL_SERVER_ERROR.equals(status)) {
            //服务器内部错误 - 500
            request.setAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE, ex, WebRequest.SCOPE_REQUEST);
        }

        //打印异常信息
        logger.error(ex.getMessage(), ex);

        //返回错误code 和 异常信息
        ResponseMessage<Object> res = ResponseMessage.error(status.value(), ex.getMessage());
        return new ResponseEntity<>(res, headers, status);
    }

    /**
     * 自定义MethodArgumentNotValidException的响应
     *
     * @param ex
     * @param headers
     * @param status
     * @param request
     * @return
     */
    @Override
    protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {
        StringBuffer stringBuffer = new StringBuffer();
        ex.getBindingResult().getAllErrors().forEach(error ->
                stringBuffer.append(error.getDefaultMessage()).append(";")
        );

        ResponseMessage<Object> res = ResponseMessage.error(status.value(), ex.getMessage());
        return new ResponseEntity<>(res, headers, HttpStatus.OK);
    }
}

返回

{
  "message": "id不能为空!",
  "result": null,
  "status": 500,
  "timestamp": 1599644944593,
  "code": null,
  "includes": null,
  "excludes": null
}

参考文章:你真的了解spring boot全局异常处理吗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值