Docs 菜单
Docs 主页
/ / /
Rust 驱动程序

操作错误处理

在此页面上

  • Overview
  • 错误类型
  • 连接错误
  • 写入错误类型
  • WriteConcernError
  • WriteError

本页介绍了使用 MongoDB Rust 驱动程序执行 MongoDB 操作时可能遇到的错误。 了解驱动程序引发的操作错误类型后,就可以采取适当的操作来处理这些错误或更正导致错误的代码。

注意

本页仅介绍操作错误处理。 如果您在使用 MongoDB 或驱动程序时遇到任何其他问题,请访问以下资源:

  • 连接故障排除,了解连接到 MongoDB 部署时可能遇到的问题的潜在解决方案

  • 问题和帮助页面提供有关报告错误、为驱动程序做出贡献以及查找更多资源的信息

  • 用于提问、讨论或一般技术支持的MongoDB Community论坛

如果驾驶员在执行操作时遇到错误,则会返回错误 类型的错误。

Error类型包含kind字段,该字段描述发生的错误类型。 kind字段的值为枚举 ErrorKindErrorKind枚举具有针对不同类型错误的变体,其中包括:

  • InvalidArgument:您为方法提供的参数无效

  • Authentication:驱动程序在身份验证期间遇到错误

  • ServerSelection:客户端无法为操作选择服务器

  • Write:写入操作期间发生错误

  • Transaction:事务期间发生错误

例如,如果尝试执行与collection中已存在的字段值重复的插入操作,驱动程序将返回实例并打印以下错误消息:_idError

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字段值为WriteError实例。 Write变体的主体是枚举 WriteFailure ,它采用 WriteError 类型的值 或 WriteConcernError。

当您执行写入操作并且驱动程序无法满足指定的写关注(write concern)时,驱动程序会引发WriteConcernError错误。例如,如果您为具有三个节点的副本集上的操作指定写关注(write concern)majority ,则当写入操作仅传播到一个节点时,驱动程序会返回此错误。

要了解有关写关注的更多信息,请参阅 MongoDB Server手册中的 写关注 。

驱动程序会在执行与满足写关注(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字段提供了有关失败操作的具体详细信息。 要解决此错误,您必须修改文档以遵守模式验证规则或绕过验证。

要了解有关模式验证的更多信息,请参阅模式验证指南

后退

连接故障排除