操作错误处理
Overview
本页介绍了使用 MongoDB Rust 驱动程序执行 MongoDB 操作时可能遇到的错误。 了解驱动程序引发的操作错误类型后,就可以采取适当的操作来处理这些错误或更正导致错误的代码。
注意
本页仅介绍操作错误处理。 如果您在使用 MongoDB 或驱动程序时遇到任何其他问题,请访问以下资源:
连接故障排除,了解连接到 MongoDB 部署时可能遇到的问题的潜在解决方案
问题和帮助页面提供有关报告错误、为驱动程序做出贡献以及查找更多资源的信息
用于提问、讨论或一般技术支持的MongoDB Community论坛
错误类型
Error
类型包含kind
字段,该字段描述发生的错误类型。 kind
字段的值为枚举 ErrorKind 。ErrorKind
枚举具有针对不同类型错误的变体,其中包括:
InvalidArgument
:您为方法提供的参数无效Authentication
:驱动程序在身份验证期间遇到错误ServerSelection
:客户端无法为操作选择服务器Write
:写入操作期间发生错误Transaction
:事务期间发生错误
例如,如果尝试执行与collection中已存在的字段值重复的插入操作,驱动程序将返回实例并打印以下错误消息:_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
。错误消息描述了并发操作失败的原因。
要了解如何调整连接池以解决此错误,请参阅 MongoDB Server手册中的 调整连接池设置 。
根据产生错误的情况,驱动程序可能会为错误添加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
当您执行写入操作并且驱动程序无法满足指定的写关注(write concern)时,驱动程序会引发WriteConcernError
错误。例如,如果您为具有三个节点的副本集上的操作指定写关注(write concern)majority
,则当写入操作仅传播到一个节点时,驱动程序会返回此错误。
WriteError
驱动程序会在执行与满足写关注(write concern)无关的写入操作时遇到任何错误,从而引发WriteError
错误。由于导致此错误的原因有很多,因此WriteError
类型包含描述写入错误类型和错误原因的字段。
例如,如果您尝试将文档插入到违反collection模式验证规则的collection中,驱动程序会引发WriteError
错误。假设collection有一条规则,其中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
字段提供了有关失败操作的具体详细信息。 要解决此错误,您必须修改文档以遵守模式验证规则或绕过验证。
要了解有关模式验证的更多信息,请参阅模式验证指南。