Вы можете выполнить переход из Failure Error
в другой тип, который реализует Fail
, используя одну из трех функций:
use failure; // 0.1.5
use std::{fs, io};
fn generate() -> Result<(), failure::Error> {
fs::read_to_string("/this/does/not/exist")?;
Ok(())
}
fn main() {
match generate() {
Ok(_) => panic!("Should have an error"),
Err(e) => match e.downcast_ref::<io::Error>() {
Some(e) => println!("Got an io::Error: {}", e),
None => panic!("Could not downcast"),
},
}
}
В вашем конкретном случае, я предполагаю, что вы либо сталкиваетесь с несовпадающими версиями зависимостей (см. Почему черта не реализована для типа, в котором она явно реализована? для примеров и методов, какотследить это) или что вы просто получаете неправильный тип ошибки.Например, отсутствующий файл на самом деле является std::io::Error
:
// epub = "1.2.0"
// zip = "0.4.2"
// failure = "0.1.5"
use std::io;
fn main() {
if let Err(error) = epub::doc::EpubDoc::new("a.epub") {
match error.downcast_ref::<io::Error>() {
Some(i) => println!("IO error: {}", i),
None => {
panic!("Other error: {} {:?}", error, error);
}
}
}
}