gpt4 book ai didi

error-handling - 有没有一种标准的方法可以在错误中包装一个字符串?另外,如何制作、装箱并返回自定义错误类型?

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

我正在编写一个基本程序并将工作放在try_main,如果 try_main 返回 Error,则以非零值退出。

基本的 try! 语句有效,但我不知道如何返回自定义错误。首先,我尝试返回一个包含在标准错误中的字符串,然后我尝试实现我自己的错误类型,但它提示我试图返回错误而不是结果。

是否有一种标准的方法来将字符串包装在错误中?另外,如何制作、装箱并返回自定义错误类型?

fn main() {
match try_main() {
Ok(()) => {},
Err(e) => {
println!("thumbnail extractor failed with {:?}", e.description());
std::process::exit(1);
}
}

}

fn try_main() -> Result<(), Box<std::error::Error>> {
let args : Vec<_> = std::env::args_os().collect();
let filename = args.get(1).expect("needs one argument") ;
println!("filename: {:?}", filename);


// if !(filename.to_string_lossy().ends_with(".odf") || filename.to_string_lossy().ends_with(".ora"))
// {
// let s = std::io::Error::new(Error::new(ErrorKind::Other, "This program only supports creating thumbnails from odf or ora files.".to_string()));
// return s;
// }
let f = try!(File::open(filename));

let mut odf = try!(zip::ZipArchive::new(f));
let thumb_name = r"Thumbnails/thumbnail.png";
let mut thumb_file_in_zip = try!(odf.by_name(thumb_name).or(Err("could not find thumbnail zip file")));

let mut fw = try!(File::create(r"thumbnail.png"));
let mut buffer : Vec<u8> = Vec::new();
try!(thumb_file_in_zip.read_to_end(& mut buffer));
try!(fw.write_all(buffer.as_slice()));
Ok(())
}

最佳答案

Result<T, E>是一个 enum有两个变体 Ok(T)Err(E) .

当您实例化 Result<T, E> 时您必须明确说明您想要的变体。

在您的特定情况下,您必须返回 Err(s) (假设 sE 类型,您可能必须在代码中使用 Box::new,我没有检查 s 是否正确,只是缺少 Err)。

开始使用自定义错误类型的一种方法如下:

enum MyError {
IoError,
OtherError,
}

fn try_main() -> Result<(), MyError> {
// do stuff
return Err(MyError::IoError);
}

这是一种简单的方法,您可能需要更多信息 impl std::error::Error for MyErrorimpl From<std::io::Error> for MyError ,可能将原始错误保留在 MyError 中. 尽管这是可选的。

有一个 chapter on the book关于错误处理的更多细节。

关于error-handling - 有没有一种标准的方法可以在错误中包装一个字符串?另外,如何制作、装箱并返回自定义错误类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33755963/

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