Unable to implement custom enum wrapper for std::error::Error

Unable to implement custom enum wrapper for std::error::Error

我试图弄清楚错误枚举是如何通过为 Url 传递错误输入来包装 std::error:Error 的。我想包装 url::ParseError.

use std::error::Error;
use std::fmt::Display;

#[derive(Debug)]
pub enum WordCount {
    UrlError(url::ParseError),
}

impl Display for WordCount {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            WordCount::UrlError(e) => {
                write!(f, "{}", e)
            },
        }
    }
}

impl std::error::Error for WordCount {}

impl From<url::ParseError> for WordCount {
    fn from(err: url::ParseError) -> Self {
        WordCount::UrlError(err)
    }
} 

pub fn run() -> Result<String, WordCount> {
    let args: Vec<String> = env::args().collect();
    let arg = &args[1].as_ref();
    let domain = Url::parse(arg);

    match domain {
        Ok(_) => {}
        Err(err) => return Err(WordCount::UrlError(err)),
   };

    Ok("".to_owned())
}

如果我替换以下行: Err(err) => return Err(WordCount::UrlError(err)),fn run()

与:panic!("some string") 例如

   match domain {
    Ok(domain) => println!("happy domain"),
    Err(err) => panic!("panicking"),
};

然后我可以看到一条错误打印到终端。但是没有实现,即使我实现了 Display.

,也没有任何内容打印到 stderr

只是 return 一个错误不会隐含地打印出来。你可以让你的 main 函数到 return 相同的错误,然后你的程序将在执行结束时报告消息。例如:

use url::Url;
use std::error::Error;
use std::fmt::Display;

#[derive(Debug)]
pub enum CrawlerError {
    UrlError(url::ParseError),
}

impl Display for CrawlerError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            CrawlerError::UrlError(e) => {
                write!(f, "{}", e)
            },
        }
    }
}

impl std::error::Error for CrawlerError {}

impl From<url::ParseError> for CrawlerError {
    fn from(err: url::ParseError) -> Self {
        CrawlerError::UrlError(err)
    }
} 

pub fn run() -> Result<String, CrawlerError> {
    let domain = Url::parse("foo/bar");

    match domain {
        Ok(_) => Ok("".to_string()),
        Err(err) => Err(CrawlerError::UrlError(err)),
   }

}

fn main() -> Result<(), CrawlerError> {
    run()?;
    Ok(())
}

Playground

结果:

   Compiling playground v0.0.1 (/playground)
    Finished dev [unoptimized + debuginfo] target(s) in 1.25s
     Running `target/debug/playground`
Error: UrlError(RelativeUrlWithoutBase)