如何手动返回结果>?

问题描述 投票:5回答:3

如果条件为真,我想从函数返回错误:

use std::error::Error;

pub fn run() -> Result<(), Box<dyn Error>> {
    // -- snip ---

    if condition {
        // return error
    }

    // -- snip --

    Ok(())
}

fn main() {}

我可能没有类型系统的基础知识,但是在我看来,人们到处都使用?运算符,所以我不知道要返回哪种类型。

  1. 是否可能仅返回这样的错误?
  2. 是否有更好的方法来处理此逻辑?
error-handling rust type-systems
3个回答
8
投票

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" } }
  • 实施Create your own error typeDebug,然后是Display
  • 如果有错误,请返回ErrorErr变体。

我建议您使用Result删除所有错误样板:

failure

-

请注意,如果您期望使用#[derive(Fail, Debug)] #[fail(display = "There is an error: {}.", _0)] struct MyError(String); ,则可以返回所需的任何类型,只要它实现了Error。这包括Error中的错误类型。


2
投票

我是Rust的新手,但鉴于该函数设置为返回std,这是我的肮脏技巧,可返回自定义错误:

Result<(), Box<dyn Error>>

1
投票

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")?; } // ... } 是具有两个变体的枚举。要返回它们中的任何一个,只需使用相应的变体即可。

© www.soinside.com 2019 - 2024. All rights reserved.