在我的 Rust 应用程序中,我需要对重复键(代码 11000)错误进行特殊处理。我想出了这个解决方案,但它看起来很复杂。有没有更好的方法?
let res = collection.insert_one(entry).await;
match res {
Ok(_) => Ok(()),
Err(e) => {
// println!("{:?}", e);
match *e.kind {
ErrorKind::Write(failure) => {
match failure {
WriteFailure::WriteError(we) => {
if we.code == 11000 { Ok(()) }
else { Err("other write failure".into()) }
},
_ => Err("other write error".into()),
}
},
_ => Err("other error".into()),
}
},
}
目前尚不清楚您是否需要
Err
在此处返回所有不同的可能值,但假设在其他情况下仅返回原始错误就可以了,这会变得简单得多。首先,将“此错误是否为重复键错误”的测试分解为一个函数。这样您可以在需要时重用此逻辑。
现在我们可以简单地使用匹配保护将其应用到您的代码中,仅将这种特定类型的错误转换为成功。
如果这是你程序中非常常见的模式,你可以将其放在
Result
这样的扩展方法后面:现在你的代码变成:
这是否更简单/更清晰是主观的,但这是一种有效的方法。