如果条件为真,我想从函数返回错误:
use std::error::Error;
pub fn run() -> Result<(), Box<dyn Error>> {
// -- snip ---
if condition {
// return error
}
// -- snip --
Ok(())
}
fn main() {}
我可能没有类型系统的基础知识,但是在我看来,人们到处都使用?
运算符,所以我不知道要返回哪种类型。
Error
是一个特征,您想返回一个特征对象(请注意dyn
keyword),因此您需要实现此特征:
dyn
use std::error::Error;
use std::fmt;
#[derive(Debug)]
struct MyError(String);
impl fmt::Display for MyError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "There is an error: {}", self.0)
}
}
impl Error for MyError {}
pub fn run() -> Result<(), Box<dyn Error>> {
let condition = true;
if condition {
return Result::Err(Box::new(MyError("Oops".into())));
}
Ok(())
}
fn main() {
if let Err(e) = run() {
println!("{}", e); // "There is an error: Oops"
}
}
,Debug
,然后是Display
,Error
的Err
变体。我建议您使用Result
删除所有错误样板:
failure
-
请注意,如果您期望使用#[derive(Fail, Debug)]
#[fail(display = "There is an error: {}.", _0)]
struct MyError(String);
,则可以返回所需的任何类型,只要它实现了Error
。这包括Error
中的错误类型。
我是Rust的新手,但鉴于该函数设置为返回std
,这是我的肮脏技巧,可返回自定义错误:
Result<(), Box<dyn Error>>
A fn serve(config: &Config, stream: TcpStream) -> Result<(), Box<dyn Error>> {
// ...
if request_is_bad() {
// This returns immediately a custom "Bad request" error
Err("Bad request")?;
}
// ...
}
是具有两个变体的枚举。要返回它们中的任何一个,只需使用相应的变体即可。