Rust 中提前返回处理错误的惯用方法

Jam*_*ill 4 error-handling webserver idioms rust actix-web

我目前有以下代码来处理我想要处理错误而不传播或继续该函数的情况。其用例是一个 Web 服务器控制器,我更喜欢手动处理可能的错误 - 这就是返回类型为HttpResponse.

我想知道是否有一种方法可以在不进行此unwrap调用的情况下执行此操作,因为根据我的理解,编译器应该知道此时有一种方法可以解包到一个值,而不会出现恐慌的风险。

    // ...
    
    let result: Result<u8, Error> = func_that_could_error();
    if result.is_err() {
        return HttpResponse::InternalServerError();
    }
    let value: u8 = result.unwrap();
    
    // ...
Run Code Online (Sandbox Code Playgroud)

Aco*_*orn 5

如果可以的话,请使用?:

let value = func_that_could_error()?;
Run Code Online (Sandbox Code Playgroud)

可以选择将其映射到您的错误,如 @Jmb 建议的那样:

let value = func_that_could_error()
    .map_err(|_| HttpResponse::InternalServerError())?;
Run Code Online (Sandbox Code Playgroud)

否则,使用let else:

let Ok(value) = func_that_could_error() else {
    return HttpResponse::InternalServerError();
};
Run Code Online (Sandbox Code Playgroud)

或者,对于 Rust < 1.65 match,:

let value = match func_that_could_error() {
    Err(_) => return HttpResponse::InternalServerError(),
    Ok(v) => v,
};
Run Code Online (Sandbox Code Playgroud)