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(())
}
结果:
Compiling playground v0.0.1 (/playground)
Finished dev [unoptimized + debuginfo] target(s) in 1.25s
Running `target/debug/playground`
Error: UrlError(RelativeUrlWithoutBase)
我试图弄清楚错误枚举是如何通过为 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(())
}
结果:
Compiling playground v0.0.1 (/playground)
Finished dev [unoptimized + debuginfo] target(s) in 1.25s
Running `target/debug/playground`
Error: UrlError(RelativeUrlWithoutBase)