gpt4 book ai didi

error-handling - 如何从失败错误中检索底层错误?

转载 作者:行者123 更新时间:2023-11-29 08:26:27 24 4
gpt4 key购买 nike

当尝试使用 epub-rs 打开损坏的 epub/ZIP 文件时,zip-rs crate 错误(不使用 Failure)被包装到 failure::Error 中通过 epub-rs。我想用不同的错误处理程序处理 zip-rs 的每种错误类型,并且需要一种方法来匹配底层错误。如何从失败中检索它?

fn main() {
match epub::doc::EpubDoc::new("a.epub") {
Ok(epub) => // do something with the epub
Err(error) => {
// handle errors
}
}
}

error.downcast::<zip::result::ZipError>()失败并且 error.downcast_ref()返回无。

最佳答案

您可以从失败中垂头丧气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"),
},
}
}

对于您的具体情况,我猜测您要么遇到了不匹配的依赖项版本(请参阅 Why is a trait not implemented for a type that clearly has it implemented? 以了解有关如何追踪此问题的示例和技术),要么您只是得到了错误的错误类型。例如,丢失的文件实际上是一个 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);
}
}
}
}

关于error-handling - 如何从失败错误中检索底层错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56082445/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com