Error handling 如何在使用Box装箱后处理不同的错误类型<;错误::错误>;?
为了更好地处理错误并防止重复太多代码,我实现了操作符,返回Error handling 如何在使用Box装箱后处理不同的错误类型<;错误::错误>;?,error-handling,rust,Error Handling,Rust,为了更好地处理错误并防止重复太多代码,我实现了操作符,返回结果,这样我就可以匹配一次而不是多次错误 我使用多个matches更改了以下代码: fn example(pool: mysql::Pool) { let now = match SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) { Ok(n) => n.as_secs(), Err(_) => panic!("System
结果
,这样我就可以匹配一次而不是多次错误
我使用多个match
es更改了以下代码:
fn example(pool: mysql::Pool) {
let now = match SystemTime::now().duration_since(SystemTime::UNIX_EPOCH) {
Ok(n) => n.as_secs(),
Err(_) => panic!("SystemTime before UNIX EPOCH!"),
};
// create table
match pool.prep_exec("CREATE TABLE IF NOT EXISTS dbpulse_rw (id INT NOT NULL, t INT(11) NOT NULL, PRIMARY KEY(id))", ()) {
Ok(_) => (),
Err(e) => {
eprintln!("{}", e);
return;
}
}
// write into table
let mut stmt = match pool
.prepare("INSERT INTO dbpulse_rw (id, t) VALUES (1, ?) ON DUPLICATE KEY UPDATE t=?")
{
Ok(stmt) => stmt,
Err(e) => {
eprintln!("{}", e);
return;
}
};
match stmt.execute((now, now)) {
Ok(_) => (),
Err(mysql::Error::IoError(e)) => {
eprintln!("IoError: {}", e);
// send alert
return;
}
Err(e) => {
eprintln!("{}", e);
return;
}
}
let items = match pool.prep_exec("SELECT t FROM dbpulse_rw WHERE id=1", ()) {
Ok(n) => n,
Err(mysql::Error::IoError(e)) => {
eprintln!("IoError: {}", e);
//send_alert
return;
}
Err(e) => {
eprintln!("{}", e);
return;
}
};
for row in items {
let pool = pool.clone();
let rs = mysql::from_row::<u64>(row.unwrap());
if now != rs {
// send alert
}
assert_eq!(now, rs);
}
}
我现在想做的是根据错误,超时或查询错误,或其他错误类型来匹配
。我正在创建MySQL池,如下所示:
let mut opts = mysql::OptsBuilder::from_opts(dsn);
opts.stmt_cache_size(0);
opts.read_timeout(Some(Duration::new(3, 0)));
opts.write_timeout(Some(Duration::new(3, 0)));
let pool = mysql::Pool::new_manual(1, 5, opts).expect("Could not connect to MySQL");
如果一个查询需要3秒钟以上,它将返回一个mysql::Error::IoError
我想区分其他可能的错误,到目前为止我已经尝试过:
fun run_example() {
match example() {
Ok(_) => (),
Err(mysql::Error::IoError(e)) => {
eprintln!("IoError: {}", e);
// send alert
return;
}
Err(e) => {
eprintln!("{}", e);
return;
}
}
}
但我得到了一个不匹配的类型错误:
应为结构'std::boxed::Box',找到枚举'mysql::error::error'`
关于如何实现这一点,有什么建议或更好的想法吗?使用特征会丢失具体的类型信息。一些错误板条箱可以帮助您,但这意味着将特性强制转换为具体类型,因此可能会在运行时失败
我建议您创建一个类型
MyError
,并列出函数可能产生的所有潜在错误。然后,您可以很好且快速地匹配实际错误。例如,使用看起来您的问题可能由的答案回答。如果没有,请回答您的问题以解释差异。否则,我们可以将此问题标记为已回答。
fun run_example() {
match example() {
Ok(_) => (),
Err(mysql::Error::IoError(e)) => {
eprintln!("IoError: {}", e);
// send alert
return;
}
Err(e) => {
eprintln!("{}", e);
return;
}
}
}