如何在不关闭程序的情况下捕获恐慌

fis*_*rty 13 rust rust-cargo

我需要在程序运行时出现恐慌并且不关闭程序。例如,如何在这里捕获恐慌并打印 \xe2\x80\x9cHello, World\xe2\x80\x9d?:

\n
fn main() {\n    let v = vec![1, 2, 3];\n\n    v[99];\n    println!("Hello, World");\n}\n
Run Code Online (Sandbox Code Playgroud)\n

isa*_*tfa 23

您可以用来std::panic::catch_unwind捕捉放松恐慌,但请务必先阅读文档:

fn main() {
    let v = vec![1, 2, 3];
    let panics = std::panic::catch_unwind(|| v[99]).is_err();
    assert!(panics);
    println!("Hello, World");
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ter 6

如果你不知道索引在运行时是否有效,可以使用get代替[]索引。Some()如果元素存在或None不存在,这将返回一个选项:

if let Some(x) = v.get(99) {

}
Run Code Online (Sandbox Code Playgroud)

或者:

match v.get(99) {
  Some(x) => {

  },
  None => {
  }
}
Run Code Online (Sandbox Code Playgroud)

如果这是一个更一般的问题,并且给定的代码片段只是一个示例,那么正确的答案是你不这样做——恐慌不是为了控制流。如果需要从错误中恢复,则应使用返回 aResult或 的方法Option

  • 不幸的是,这个答案并没有真正帮助。如果您使用的库在不应该发生恐慌时发生恐慌,那么您唯一的办法就是从头开始完全重写该方法。它可能很简单,或者您可能必须有效地分叉该库并从头开始。这不是一个答案。我们可以鼓吹“恐慌不是为了控制流程”,直到我们脸色发青,但如果没有人在听,那就无济于事。 (3认同)