[英]How to handle multiple errors in Rust-Diesel?
我的 Rust 项目使用柴油和 postgres。
我现在正在努力解决的问题是,当我 insert_into 表时,可能会发生不同的错误,我想对不同的错误类型采取不同的操作。
这些是错误: Diesel DatabaseErrorKind
我想做这样的事情( 来源):
use std::fs::File;
use std::io::ErrorKind;
fn main() {
let f = File::open("hello.txt");
let f = match f {
Ok(file) => file,
Err(error) => match error.kind() {
ErrorKind::NotFound => match File::create("hello.txt") {
Ok(fc) => fc,
Err(e) => panic!("Problem creating the file: {:?}", e),
},
other_error => {
panic!("Problem opening the file: {:?}", other_error)
}
},
};
}
问题是柴油错误没有 error.kind() 。
“错误类型”模式在某些情况下很有用,在这些情况下,所有错误都基本相同,或者有很多共同的信息/有效载荷,并且除了错误类型之外没有任何个性。 Diesel 使用这种模式来处理数据库错误(因此DatabaseErrorKind
),因为数据库引擎通常只提供一个错误标识符/代码和一堆元数据,但是哪个错误得到哪个元数据通常是未记录的并且随着时间的推移而变化。
然而,在顶层 Diesel 更准确地知道错误是什么以及每个错误可以发出什么信号,因此它使用直接错误 enun 。
所以你只是......匹配而不是匹配错误类型:
match r {
Ok(r) => ...,
Err(e) => match e {
NotFound => ...,
InvalidCString(_) => ...,
[etc...]
也应该可以将匹配变平,例如
match r {
Ok(r) => ...,
Err(NotFound) => ...,
Err(InvalidCString(_)) => ...,
[etc...]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.