Rust中MongoDB重复键(11000)错误的优化处理方案咨询
优化MongoDB重复键错误处理的几种方式
你这段嵌套三层match的代码确实冗余,下面是几种更简洁的优化思路:
1. 用if let链式匹配减少嵌套
直接把多层模式匹配合并到一个if let中,砍掉不必要的嵌套层级:
let res = collection.insert_one(entry).await; match res { Ok(_) => Ok(()), Err(e) => { if let ErrorKind::Write(WriteFailure::WriteError(we)) = *e.kind { if we.code == 11000 { Ok(()) } else { Err("其他写入失败".into()) } } else { Err("其他错误".into()) } } }
2. 封装工具函数复用判断逻辑
如果多处需要判断重复键错误,把判断逻辑抽成单独函数,代码更清晰且可复用:
use mongodb::{error::{Error, ErrorKind, WriteFailure}}; fn is_duplicate_key_error(e: &Error) -> bool { matches!( *e.kind, ErrorKind::Write(WriteFailure::WriteError(we)) if we.code == 11000 ) } // 使用时的代码 let res = collection.insert_one(entry).await; match res { Ok(_) => Ok(()), Err(e) => { if is_duplicate_key_error(&e) { Ok(()) } else if matches!(*e.kind, ErrorKind::Write(_)) { Err("其他写入失败".into()) } else { Err("其他错误".into()) } } }
3. 用Result链式调用简化代码
利用Result的or_else方法,把错误处理逻辑链式写在一起,代码更紧凑:
collection.insert_one(entry).await.or_else(|e| { match *e.kind { ErrorKind::Write(WriteFailure::WriteError(we)) if we.code == 11000 => Ok(()), ErrorKind::Write(_) => Err("其他写入失败".into()), _ => Err("其他错误".into()), } })
如果不需要区分“其他写入失败”和“其他错误”,还能进一步简化:
collection.insert_one(entry).await.or_else(|e| { if matches!( *e.kind, ErrorKind::Write(WriteFailure::WriteError(we)) if we.code == 11000 ) { Ok(()) } else { Err(e.into()) // 或者返回自定义错误类型 } })
内容的提问来源于stack exchange,提问作者Cutty Shark
相关产品推荐
相关产品推荐

