当知道某段代码可能会抛出错误时,我们使用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中使用这样的构造,以确保即使在发生错误后它仍能继续运行.

推荐答案

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.


另见:

Rust相关问答推荐

错误[E0793]具体何时发生:对打包字段的引用未对齐触发?

在一个tauri协议处理程序中调用一个rectuc函数的推荐技术是什么?

当两者都有效时,为什么Rust编译器建议添加';&;而不是';*';?

将PathBuf转换为字符串

有没有一种惯用的方法来判断VEC中是否存在变体?

如何将单个 struct 实例与插入器一起传递到Rust中的映射

在复制类型中使用std::ptr::WRITE_VILAR进行内部可变性的安全性(即没有UnSafeCell)

使用关联类型重写时特征的实现冲突

为什么Option类型try块需要类型注释?

在Rust内联程序集中使用字符串常量

返回Result<;(),框<;dyn错误>>;工作

如何设置activx websocket actorless的消息大小限制?

当我编译 Rust 代码时,我是否缺少 AVX512 的目标功能?

随机函数不返回随机值

Rust中的一生语法有什么作用?

有没有办法隐式绑定 let/match 操作的成员?

切片不能被 `usize` 索引?

为什么在 rust 中删除 vec 之前应该删除元素

如何在 Rust 中编写涉及异步的重试函数

在 Rust 中获得准确时间的正确方法?