在 Rust 中使用 and_then 有条件地处理特定错误

问题描述

我如何知道在 Rust 中通过 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <!doctype html> <html lang="en"> <head> <!-- Required meta tags --> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <link rel="stylesheet" href="libs/v6.5.0/css/ol.css" type="text/css"> <link rel="stylesheet" href="libs/v6.5.0/examples/resources/layout.css" type="text/css"> <link rel="stylesheet" href="libs/ol-ext-master/dist/ol-ext.css" /> <link rel="stylesheet" href="libs/jquery-ui-1.12.1/jquery-ui.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css" integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous"> </head> <body> <div id="title"> <marquee behavior="scroll" direction="right"><h5><b>Title goes here</b></h5> </marquee></div> <!-- MODAL WINDOW --> <div id="myModal" class="modal fade"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title">Welcome to web-map app!</h5> <button type="button" class="close" data-dismiss="modal">&times;</button> </div> <div class="modal-body"> <img class="capimg" src="https://sss.jpg" width="300" height="100" /> <p style="text-align:justify">Text here</p> </div> </div> </div> </div> <div id="map"> </div> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js" integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns" crossorigin="anonymous"></script> <script src="libs/v6.5.0/build/ol.js"></script> <script src="libs/ol-layerswitcher-master/dist/ol-layerswitcher.js"></script> </body> </html> 管道 Result 时发生了什么错误?例如使用嵌套匹配我可以这样做:

and_then

或者我可以使用 use std::num::ParseIntError; fn get_num(n: u8) -> Result<u8,ParseIntError> { // Force a ParseIntError "foo ".parse() } fn add_one(n: u8) -> Result<u8,ParseIntError> { Ok(n + 1) } fn main() { match get_num(1) { Ok(n) => { match add_one(n) { Ok(n) => println!("adding one gives us: {}",n),Err(why) => println!("Error adding: {}",why) } },Err(why) => println!("Error getting number: {}",why),} } 将第一个函数的结果通过管道传递给第二个函数并避免嵌套匹配:

and_then

如何使用 match get_num(1).and_then(add_one) { Ok(n) => println!("Adding one gives us: {}",Err(why) => println!("Some error: {}.",why) } 有条件地、惯用地确定第二种形式的错误?我必须键入检查错误吗?当然我可以像上面那样显示错误,但假设我想用与错误类型相关的内容作为开头?

解决方法

通常的方法是使用 map_err 将初始错误转换为您可以控制的更丰富的内容,例如

enum MyError {
    Parsing,Adding
}

get_num(1).map_err(|_| MyError::Parsing)
    .and_then(|v| add_one(v).map_err(|_| MyError::Adding)

遗憾的是,正如您所见,这需要对 and_then 回调使用 lambda:and_then 必须返回与输入相同的错误类型,因此在这里它必须产生一个 Result<_,MyError>, wj 这不是 add_one 的返回类型。

虽然在其他情况下我们可以使用 ? 进行一些恢复,但这里相同的原始错误 type 被分成两个不同的值。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...