在 Rust 中使用早期 return 处理错误的惯用方法
Idiomatic way to handle errors with an early return in Rust
我目前有以下代码来处理我想在不传播的情况下处理错误或继续该功能的情况。这个用例是一个网络服务器控制器,我更愿意手动处理可能的错误——这就是为什么 return 类型是 HttpResponse
.
我想知道是否有一种方法可以在没有这个 unwrap
调用的情况下执行此操作,因为据我所知,编译器应该知道此时有一种方法可以解包为一个值而不会出现恐慌.
// ...
let result: Result<u8, Error> = func_that_could_error();
if result.is_err() {
return HttpResponse::InternalServerError();
}
let value: u8 = result.unwrap();
// ...
如果可以,请使用?
:
let value = func_that_could_error()?;
可选择将其映射到您的错误,如@Jmb 建议:
let value = func_that_could_error()
.map_err(|_| HttpResponse::InternalServerError())?;
如果不能使用?
,请使用match
:
let value = match func_that_could_error() {
Err(_) => return HttpResponse::InternalServerError(),
Ok(v) => v,
};
未来 let-else
(不稳定):
let Ok(value) = func_that_could_error() else {
return HttpResponse::InternalServerError();
};
我目前有以下代码来处理我想在不传播的情况下处理错误或继续该功能的情况。这个用例是一个网络服务器控制器,我更愿意手动处理可能的错误——这就是为什么 return 类型是 HttpResponse
.
我想知道是否有一种方法可以在没有这个 unwrap
调用的情况下执行此操作,因为据我所知,编译器应该知道此时有一种方法可以解包为一个值而不会出现恐慌.
// ...
let result: Result<u8, Error> = func_that_could_error();
if result.is_err() {
return HttpResponse::InternalServerError();
}
let value: u8 = result.unwrap();
// ...
如果可以,请使用?
:
let value = func_that_could_error()?;
可选择将其映射到您的错误,如@Jmb 建议:
let value = func_that_could_error()
.map_err(|_| HttpResponse::InternalServerError())?;
如果不能使用?
,请使用match
:
let value = match func_that_could_error() {
Err(_) => return HttpResponse::InternalServerError(),
Ok(v) => v,
};
未来 let-else
(不稳定):
let Ok(value) = func_that_could_error() else {
return HttpResponse::InternalServerError();
};