java中将mongoexception转译为documentdatabaseexception的核心是捕获原始异常、提取关键信息、封装为业务语义更清晰的新异常,同时保留原始异常链以方便排查。

在 Java 中将 MongoException 转译为自定义的 DocumentDatabaseException,核心是**捕获原始异常、提取关键信息、封装为业务语义更清晰的新异常**,同时保留原始异常链以方便排查。
明确自定义异常的设计目标
定义 DocumentDatabaseException 时应继承 RuntimeException(或根据需要继承 Exception),并提供构造函数支持:错误码、业务提示消息、原始异常引用。例如:
public class DocumentDatabaseException extends RuntimeException {
private final String errorCode;
public DocumentDatabaseException(String errorCode, String message, Throwable cause) {
super(message, cause);
this.errorCode = errorCode;
}
// 可选:仅带 errorCode 和 message 的重载
public DocumentDatabaseException(String errorCode, String message) {
this(errorCode, message, null);
}
public String getErrorCode() {
return errorCode;
}
}
按异常类型做差异化转译
MongoException 是父类,实际抛出的多为子类(如 MongoTimeoutException、MongoWriteException、MongoSocketException 等)。建议按具体子类映射不同错误码和语义:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
写失败(如唯一键冲突、校验失败) → 捕获
MongoWriteException,检查getWriteError().getCode(),映射为"DB_WRITE_CONFLICT"或"DB_VALIDATION_FAILED" -
连接/超时问题 → 捕获
MongoTimeoutException或MongoSocketException,统一转为"DB_CONNECTION_UNAVAILABLE" -
查询语法或权限问题 → 捕获
MongoCommandException,根据getErrorCode()区分,如 13 表示权限不足,转为"DB_ACCESS_DENIED" -
其他未覆盖的 MongoException → 统一兜底为
"DB_UNKNOWN_ERROR",保留原始异常堆栈
在 DAO 或 Repository 层集中处理
避免在每个操作里重复 try-catch,推荐在数据访问基础层(如通用 MongoTemplate 封装类)中统一拦截:
public <t> T executeWithTranslation(Supplier<t> operation) {
try {
return operation.get();
} catch (MongoWriteException e) {
int code = e.getWriteError().getCode();
String msg = switch (code) {
case 11000 -> "文档已存在,违反唯一约束";
case 121 -> "文档验证失败";
default -> "数据库写入异常";
};
throw new DocumentDatabaseException("DB_WRITE_" + code, msg, e);
} catch (MongoTimeoutException | MongoSocketException e) {
throw new DocumentDatabaseException("DB_CONNECTION_UNAVAILABLE",
"数据库连接不可用,请稍后重试", e);
} catch (MongoException e) {
throw new DocumentDatabaseException("DB_UNKNOWN_ERROR",
"数据库操作异常", e);
}
}</t></t>
调用时直接包裹业务逻辑:executeWithTranslation(() -> mongoTemplate.insert(doc, "user"));
保留原始异常上下文很重要
务必在构造 DocumentDatabaseException 时传入 cause 参数,否则会丢失原始堆栈和错误细节。日志打印时可通过 log.error("操作失败", ex) 自动输出完整链路;API 返回错误时,可提取 ex.getCause().getClass().getSimpleName() 辅助运维定位。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










