Error handling 有没有一种标准的方法可以在错误中包装字符串?另外,如何生成、框和返回自定义错误类型?
我正在写一个基本程序,并把工作放在一个Error handling 有没有一种标准的方法可以在错误中包装字符串?另外,如何生成、框和返回自定义错误类型?,error-handling,rust,Error Handling,Rust,我正在写一个基本程序,并把工作放在一个 try\u main如果try\u main返回一个错误,则以非零退出 基本的试试看语句可以工作,但我不知道如何返回自定义错误。首先我尝试返回一个用标准错误包装的字符串,然后我尝试实现我自己的错误类型,但它抱怨我试图返回一个错误而不是结果 有没有一种标准的方法可以在错误中包装字符串?另外,如何生成、框和返回自定义错误类型 fn main() { match try_main() { Ok(()) => {},
try\u main
如果try\u main
返回一个错误,则以非零退出
基本的试试看代码>语句可以工作,但我不知道如何返回自定义错误。首先我尝试返回一个用标准错误包装的字符串,然后我尝试实现我自己的错误类型,但它抱怨我试图返回一个错误而不是结果
有没有一种标准的方法可以在错误中包装字符串?另外,如何生成、框和返回自定义错误类型
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(())
}
fn main(){
匹配try_main(){
好(())=>{},
错误(e)=>{
println!(“缩略图提取器因{:?}而失败,例如description());
std::process::exit(1);
}
}
}
fn try_main()->结果{
让args:Vec=std::env::args_os().collect();
让filename=args.get(1).expect(“需要一个参数”);
println!(“文件名:{:?}”,文件名);
//if!(filename.to_string_lossy().以(“.odf”)||文件名结尾。to_string_lossy().以(“.ora”)结尾)
// {
//设s=std::io::Error::new(Error::new(ErrorKind::Other,“此程序仅支持从odf或ora文件创建缩略图。”.to_string());
//返回s;
// }
让f=try!(文件::打开(文件名));
让mut odf=try!(zip::ZipArchive::new(f));
让thumb_name=r“Thumbnails/thumbnail.png”;
让mut thumb_file_in_zip=try!(odf.by_name(thumb_name.)或(Err(“找不到缩略图zip文件”));
让mut-fw=try!(文件::create(r“thumbnail.png”);
让mut缓冲区:Vec=Vec::new();
试试!(在zip.read-to-end(&mut-buffer)中的thumb-u文件);
试试!(fw.write_all(buffer.as_slice());
好(())
}
结果
是一个枚举
,有两个变量Ok(T)
和Err(E)
在实例化结果时
必须明确说明所需的变量
在您的特定情况下,您必须返回Err(s)
(鉴于s
类型为E
,您可能必须在代码中使用Box::new
,我没有检查s
是否正确,只是缺少Err
)
开始使用自定义错误类型的一种方法如下:
enum MyError {
IoError,
OtherError,
}
fn try_main() -> Result<(), MyError> {
// do stuff
return Err(MyError::IoError);
}
enum MyError{
IoError,
其他错误,
}
fn try_main()->结果{
//做事
返回Err(MyError::IoError);
}
这是一种过于简单的方法,您可能需要MyError的impl std::error::error::error
和MyError的impl From
,可能会将原始错误保留在MyError
中尽管这是可选的。
这里有一个关于错误处理的详细信息。您是否阅读了结果
?请继续。选择“是否有在错误中包装字符串的标准方法?”或“如何生成、框选和返回自定义错误类型?”。请随意提出多个顶级问题。