spring boot 全局异常处理可以通过实现 handlerexceptionresolver 接口或添加 @controlleradvice 配合 @exceptionhandler 来捕获分库分表异常。具体做法是定义一个全局异常处理器,在方法上标注 @exceptionhandler 并指定具体的分库分表异常类(如 shardingsphereexception 或自定义的 tablesplitexception),从而拦截这些异常并进行统一响应。

如何配置全局异常处理器以拦截特定异常
要拦截分库分表异常,首先需要创建一个被 @RestControllerAdvice 注解的类。在这个类中,定义一个处理方法,使用 @ExceptionHandler 注解指定需要捕获的异常类型。对于分库分表场景,通常涉及路由计算失败或数据源找不到等问题,可以捕获通用的 RuntimeException 或更具体的 SQLException 以及分库分表中间件抛出的异常。这样做的结果是所有未处理的异常都会被这个处理器接管,返回统一的 JSON 格式错误信息。

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpStatus;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
// 记录日志
System.err.println("Caught exception: " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body("Global Error: " + e.getMessage());
}
}
上述代码展示了一个最基础的全局异常处理器。它捕获所有 Exception 类型的异常。在实际的分库分表场景中,你可能希望区分不同的错误码。例如,如果使用的是 ShardingSphere,可能会抛出 ShardingSphereException。你可以添加另一个 @ExceptionHandler(ShardingSphereException.class) 方法来专门处理这类异常,返回更详细的错误描述,比如“分片键解析失败”或“目标数据源不存在”。
如何针对分库分表中间件的异常进行细化处理
分库分表中间件(如 ShardingSphere-JDBC)通常会包装底层异常。为了更精准地处理,我们需要了解中间件抛出的异常层级。通常,SQL 执行相关的异常会被包装在 ShardingSphereException 中。我们可以在全局异常处理器中单独处理这个异常,提取其中的根本原因(Root Cause),判断是否是分库分表特有的错误,例如路由算法异常。

import org.apache.shardingsphere.exception.ShardingSphereException;
@ExceptionHandler(ShardingSphereException.class)
public ResponseEntity<String> handleShardingException(ShardingSphereException e) {
Throwable cause = e.getCause();
String errorMsg = "Sharding Error";
if (cause != null) {
errorMsg += ": " + cause.getMessage();
}
return ResponseEntity.status(HttpStatus.BAD_GATEWAY)
.body(errorMsg);
}
这段代码专门处理 ShardingSphereException。通过获取 getCause(),我们可以深入查看导致分库分表失败的原始异常。例如,如果是因为分片键缺失导致的,原始异常可能是 IllegalArgumentException。通过这种方式,前端可以根据返回的具体消息提示用户补充必要的分片键信息,而不是仅仅显示一个通用的服务器错误。
当分片键为空时全局异常处理器会返回什么结果
当请求中缺少必需的分片键时,分库分表中间件在尝试路由时会抛出异常。在全局异常处理器的作用下,这个异常会被捕获。根据前文定义的 @ExceptionHandler 逻辑,系统会返回一个 HTTP 500 或 502 状态码,并在 Body 中包含错误信息。具体来说,如果是 ShardingSphere,它会抛出 ShardingSphereException,其内部原因通常是 IllegalArgumentException,提示“Required sharding column is missing”。因此,最终用户收到的响应体将包含类似 “Sharding Error: Required sharding column is missing” 的字符串。


















