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
尽管这是可选的。

这里有一个关于错误处理的详细信息。

您是否阅读了
结果
?请继续。选择“是否有在错误中包装字符串的标准方法?”或“如何生成、框选和返回自定义错误类型?”。请随意提出多个顶级问题。