Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Error handling 如何在使用Box装箱后处理不同的错误类型<;错误::错误>;?_Error Handling_Rust - Fatal编程技术网

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;
       }
    }
}