【问题标题】:How do I ignore an error returned from a Rust function and proceed regardless?如何忽略从 Rust 函数返回的错误并继续进行?
【发布时间】:2018-07-02 18:13:15
【问题描述】:

当知道某段代码可能会抛出错误时,我们使用try/catch 块来忽略此类错误并继续。当错误不是那么重要但也许我们只想记录它时会这样做:

try{
    int i = 1/0;
} catch( ArithmeticException e){
    System.out.println("Encountered an error but would proceed.");
} 
x = y;

Java 中的这种构造会继续执行x = y;

我可以使用match 来执行此操作或任何其他构造吗?

我确实看到了一个try! 宏,但如果方法的返回类型为Result 时出现错误,它可能会返回。

我想在 UT 中使用这样的构造,以确保它即使在发生错误后也能继续运行。

【问题讨论】:

  • 也许它会返回——我推荐阅读the documentation for functions, macros, and types that you find。他们投入了大量时间和精力,涵盖了许多基本问题。
  • 感谢您向我指出@Shepmaster 的资源。但我已经通过了它们。在我看来,所有错误处理变体仅在返回 Result 类型的情况下才有效。但我希望处理一些与上面提到的 try/catch 非常相似的情况。我的函数返回一个值而不是 Result 或 Option 类型,但可能会出现恐慌,这是我想忽略的。
  • 可以使用catch_unwind,但不推荐。 Docs "不建议将此函数用于一般的 try/catch 机制。Result 类型更适合用于经常失败的函数。"
  • 我认为有人对您的问题投反对票的原因是,您不应该“丢弃”错误。正确处理它(您可以使用expect 执行此操作)或返回它,以便调用者可以自己处理错误。
  • 是的,感谢@hellow 指出。但是在 UT 中,我愿意在无论如何都有嘲笑和解决问题的地方这样做。我什至可能继续在 catch 块中断言,但不想停止 UT 的进程。

标签: rust


【解决方案1】:

Rust 中可能失败的函数返回 Result:

Result<T, E> 是用于返回和传播错误的类型。它是一个枚举变量,Ok(T) 表示成功并包含一个值,Err(E) 表示错误并包含一个错误值。

我强烈推荐阅读Rust Book中的Error Handling section

Rust 具有许多用于处理出现问题的情况的功能

如果你想忽略一个错误,你有不同的可能性:

  • 不要使用Result

      let _ = failing_function();
    

    该函数将被调用,但结果将被忽略。如果省略let _ = ,则会收到警告。

  • 使用if letmatch 忽略ResultErr 变体:

      if let Ok(ret) = failing_function() {
          // use the returned value
      }
    

    您也可以使用Result::okResult 转换为Option

      let opt = failing_function().ok();
    
  • 解开错误。如果发生错误,此代码会出现恐慌:

      let ret = failing_function().unwrap();
      // or
      let ret = failing_function().expect("A panic message to be displayed");
    

try!() 解包结果并提前返回函数,如果发生错误。但是,您应该使用? 而不是try! 作为this is deprecated


另见:

【讨论】:

  • 调用Result::ok 只是把它变成Option。那么你基本上和Result中的故事一样
  • 不,因为 rustc 确实抱怨未使用的 Result 但它抱怨未使用的 Option
  • 不确定是否有更惯用的方式告诉编译器“我故意忽略了这个结果”
  • @workerjoe .or_else 需要返回值。您可以使用if let Ok(...) = result { ... } else { println!(...) }match result { ... } 语句。
  • 作为一个在这里遇到同样问题的人,我相信if let Ok(ret) = failing_function() 是正在寻找的答案。我基本上只是不想做match failing_function() { Err(_) => {}, Ok(ret) => { ... }
猜你喜欢
  • 1970-01-01
  • 2017-09-23
  • 2015-05-12
  • 2013-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
相关资源
最近更新 更多