操作错误处理
概述
本页介绍了在使用 MongoDB Rust 驱动执行 MongoDB 操作时可能遇到的错误。一旦您了解了驱动器引发的操作错误类型,您就可以采取适当的措施来处理它们或修正导致错误的代码。
注意
本页仅涉及操作错误处理。如果您遇到任何与 MongoDB 或驱动器相关的问题,请访问以下资源
连接故障排除,以获取解决连接 MongoDB 部署时可能遇到问题的潜在解决方案
问题与帮助页面,获取有关报告错误、为驱动器做出贡献和查找更多资源的详细信息
MongoDB 社区论坛,用于提问、讨论或一般技术支持
错误类型
如果驱动程序在执行操作时遇到错误,它将返回一个错误类型。
的Error
类型包含一个描述发生错误类型的kind
字段。该kind
字段的值为枚举ErrorKind。该ErrorKind
枚举有不同的错误类型变体,包括以下几种
InvalidArgument
:向方法提供了一个无效的参数Authentication
:驱动程序在身份验证过程中遇到了错误ServerSelection
:客户端无法选择操作的服务器Write
:在写入操作期间发生错误Transaction
:在事务期间发生错误
例如,如果您尝试执行一个插入操作,该操作重复了集合中已存在的一个_id
字段值,驱动程序将返回一个Error
实例并打印以下错误消息
Error: Error { kind: Write(WriteError(WriteError { code: 11000, code_name: None, message: "E11000 duplicate key error collection: db.test_coll index: _id_ dup key: { _id: 1 }", details: None })), labels: {}, wire_version: None, source: None }
在前面的错误消息中,kind
字段的值为Write
。有关此类错误的更多信息,请参阅本指南中的写入错误类型部分。
连接错误
并发操作错误可能会清除连接池,中断您的服务器连接。在这种情况下,驱动程序会在Error
类型中引发错误,其中kind
字段的值为ConnectionPoolCleared
。错误消息描述了并发操作失败的原因。
有关如何调整您的连接池以解决此错误的信息,请参阅服务器手册中的调整连接池设置。
根据产生错误的环境,驱动程序可能会在错误中添加RetryableWriteError
标签,如下所示的错误消息
Error { kind: ConnectionPoolCleared { message: "Connection pool for localhost:27017 cleared because another operation failed with: Kind: I/O error: timed out, labels: {}" }, labels: {"RetryableWriteError"}, wire_version: None, source: None }
此标签表示错误是可重试的写入错误,这意味着驱动程序将尝试重试一次。
写入错误类型
当驱动程序在执行写操作时遇到错误,它会抛出一个具有 kind
字段值为 Write
的 Error
实例。Write
变体的主体是枚举 WriteFailure,它接受类型为 WriteError 或 WriteConcernError 的值。
写入关注错误
当您执行写入操作且驱动程序无法满足指定的写入关注时,驱动程序将引发 WriteConcernError
错误。例如,如果您在具有三个节点的副本集上指定 majority
写入关注,则如果写入操作仅传播到一个节点,驱动程序将返回此错误。
有关写入关注的更多信息,请参阅服务器手册中的写入关注。
写入错误
当驱动程序在执行写入操作时遇到与满足写入关注无关的错误时,它将引发 WriteError
错误。由于此错误有多个原因,因此 WriteError
类型包含字段,用于描述写入错误的类型和错误原因。
例如,如果尝试将文档插入违反集合模式验证规则的集合中,驱动程序将引发 WriteError
错误。假设该集合有一个规则,其中 quantity
字段的值必须是 int
类型。如果尝试插入一个其中 quantity
值为 "three"
的文档,驱动程序将打印以下错误消息
Error: Error { kind: Write(WriteError(WriteError { code: 121, code_name: None, message: "Document failed validation", details: Some(Document({"failingDocumentId": Int32(1), "details": Document({"operatorName": String("$jsonSchema"), "title": String("Numerical Validation"), "schemaRulesNotSatisfied": Array(...)})})) })), labels: {}, wire_version: None, source: None }
在上面的错误消息中,message
字段描述了错误原因,而 details
字段提供了有关失败操作的具体细节。要解决这个问题,必须修改文档以符合模式验证规则或跳过验证。
要了解有关模式验证的更多信息,请参阅关于模式验证的指南。