竹林听雨yue 2024-10-05 23:04 采纳率: 33.3%
浏览 15
已结题

springboot全局异常处理器处理顺序问题

springboot全局异常处理器处理顺序问题

在使用异常处理器时,代码


package com.ecode.handler;


import com.ecode.constant.MessageConstant;
import com.ecode.exception.BaseException;
import com.ecode.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.sql.SQLException;

/**
 * 全局异常处理器,处理项目中抛出的业务异常
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 捕获业务异常
     * @param ex
     * @return
     */
    @ExceptionHandler
    public Result exceptionHandler(BaseException ex){
        log.error("业务异常:{}", ex.getMessage());
        return Result.error(ex.getMessage());
    }

    /**
     * @param ex 数据库异常
     * @return 后端统一返回结果
     */
    @ExceptionHandler
    public Result exceptionHandler(SQLException ex){
        String message = ex.getMessage();
        log.error("数据库异常:{}",message);
        if (message.contains("Duplicate entry")){
            String username = message.split(" ")[2];
            return Result.error(username + MessageConstant.ALREADY_EXISTS);
        }else {
            return Result.error(MessageConstant.SQL_UNKNOWN_ERROR);
        }
    }

    @ExceptionHandler
    public Result exceptionHandler(Exception ex){
        log.error("服务器异常:{}",ex.getMessage());
        return Result.error("服务器异常");

    }

}

当出现数据库异常时,返回

2024-10-05 22:56:13.798 ERROR 26216 --- [nio-8080-exec-4] c.ecode.handler.GlobalExceptionHandler   : 服务器异常:
### Error updating database.  Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'xu*****@foxmail.com' for key 'user.邮箱'
### The error may exist in com/ecode/mapper/UserMapper.java (best guess)
### The error may involve com.ecode.mapper.UserMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO user  ( username, password,  email, status, name, profile_picture,    score,  create_time, update_time )  VALUES  ( ?, ?,  ?, ?, ?, ?,    ?,  ?, ? )
### Cause: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'xu****@foxmail.com' for key 'user.邮箱'
; Duplicate entry 'xu*****@foxmail.com' for key 'user.邮箱'; nested exception is java.sql.SQLIntegrityConstraintViolationException: Duplicate entry 'xu*******@foxmail.com' for key 'user.邮箱'

按理说越精确优先级越高,SQLIntegrityConstraintViolationException继承SQLException,为什么返回的却是被Exception异常捕获?求解答

  • 写回答

2条回答 默认 最新

  • 编号灬9527 2024-10-06 10:31
    关注

    因为错误信息给你的是原始异常信息,mybatis自己对于原始异常并不是直接返回的,他自己包装了一层,mybatis底层依赖sqlsession执行db操作,
    执行select的时候,它并不直接返回原始异常,ExceptionFactory.wrapException去对原始异常做了处理,最后返回给你的是RuntimeException,所以sqlException的异常处理并不会触发回调,你改写成运行时异常或者是PersistenceException,IbatisException这些就能拦截sql异常了

    img

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月15日
  • 已采纳回答 10月7日
  • 创建了问题 10月5日