我正在生锈,我正在尝试做这样的事情:
match send("select * from User;") {
ConnError => println!("Connection error!"),
DBError(e) => println!("Database error {}", e),
Ok(response) => {
...
}
}
我试图找出一种定义发送功能的简洁方法。我看到了结果枚举,但它一次只处理一种错误。我希望我能像这样定义自己的枚举:
fn send(query: str) -> enum { Ok(Box<Response>), ConnError, DBError(str) } {
...
}
唉,这是不可能的,它抱怨意外的'enum'关键字。有没有办法做我在这里尝试的,或者可能使Result处理多种错误类型?谢谢!
答案 0 :(得分:1)
正如您所说,您可以使用Result
,但您必须分别使用您的错误类型定义enum
,因为您无法在函数返回时直接定义它。
像这样:
use std::rand::distributions::{IndependentSample, Range};
fn main() {
match send("select * from foo") {
Ok(Response) => println!("response"),
Err(e) => match e {
ConnError => println!("connection error"),
DbError(err) => println!("{}", err)
}
}
}
// the enum with your errors
enum DataLayerError {
ConnError,
DbError(String)
}
struct Response; /*...*/
fn send(_query: &str) -> Result<Response, DataLayerError> {
let between = Range::new(0u, 2);
let mut rng = std::rand::task_rng();
// return a random result
match between.ind_sample(&mut rng) {
0 => Ok(Response),
1 => Err(DbError("yikes".to_string())),
2 => Err(ConnError),
_ => unreachable!()
}
}