首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何处理unwrap_or_else中的异常(Err)?

如何处理unwrap_or_else中的异常(Err)?
EN

Stack Overflow用户
提问于 2020-05-25 12:05:12
回答 1查看 384关注 0票数 1
代码语言:javascript
复制
struct OverflowError {}

fn test_unwrap() -> Result<String, OverflowError> {
    let a: Result<String, u8> = Err(100);

    let a: String = a.unwrap_or_else(|err| {
        if err < 100 {
            String::from("Ok")
        } else {
            // I want to return from the function (not just the closure)
            // This is compile error with error:
            // "the ? operator can only be used in a closure that returns Result or Option"
            Err(OverflowError {})?
        }
    });

    Ok(a)
}
代码语言:javascript
复制
error[E0277]: the `?` operator can only be used in a closure that returns `Result` or `Option` (or another type that implements `std::ops::Try`)
  --> src/lib.rs:13:13
   |
6  |       let a: String = a.unwrap_or_else(|err| {
   |  ______________________________________-
7  | |         if err < 100 {
8  | |             String::from("Ok")
9  | |         } else {
...  |
13 | |             Err(OverflowError {})?
   | |             ^^^^^^^^^^^^^^^^^^^^^^ cannot use the `?` operator in a closure that returns `std::string::String`
14 | |         }
15 | |     });
   | |_____- this function should return `Result` or `Option` to accept `?`
   |
   = help: the trait `std::ops::Try` is not implemented for `std::string::String`
   = note: required by `std::ops::Try::from_error`

这是我的代码的简化版本。基本上在unwrap_or_else闭包内部,可能有一个条件错误(例如IOError)。在这种情况下,我希望提前终止函数(使用?)。但显然它不起作用,因为它当前处于闭包中,并且闭包不需要结果类型。

处理此问题的最佳实践是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-25 13:14:02

你想要的是or_else()

代码语言:javascript
复制
struct OverflowError {}

fn test_unwrap() -> Result<String, OverflowError> {
    let a: Result<String, u8> = Err(100);

    let a: String = a.or_else(|err| {
        if err < 100 {
            Ok(String::from("Ok"))
        } else {
            Err(OverflowError {})
        }
    })?;

    Ok(a)
}

简化版:

代码语言:javascript
复制
struct OverflowError {}

fn test_unwrap() -> Result<String, OverflowError> {
    Err(100).or_else(|err| {
        if err < 100 {
            Ok(String::from("Ok"))
        } else {
            Err(OverflowError {})
        }
    })
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61995572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档