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

9
我需要在程序运行时捕获一个panic,并且不关闭程序。例如,如何在此处捕获panic并打印“Hello, World”?:

fn main() {
    let v = vec![1, 2, 3];

    v[99];
    println!("Hello, World");
}
2个回答

19

您可以使用std::panic::catch_unwind来捕获非正常终止的 panic,但一定要先阅读文档

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

5

如果你不确定索引在运行时是否有效,你可以使用get而不是[]索引。 这将返回一个选项,如果元素存在,则为Some(),否则为None

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

}

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

  },
  None => {
  }
}

如果这只是一个例子,而不是一个特定的问题,那么正确的答案是你不需要--惊恐并非控制流。如果需要从错误中恢复,应该使用返回ResultOption的方法。

恐慌不是用于控制流吗?我不明白你的意思。有 Rust 文档的链接吗? - fish0fqwerty
当然,可以查看关于“是否恐慌”的 Rust 书籍部分的链接。整个错误处理部分也可能很有用。 - John Ledbetter
1
很遗憾,这个答案并没有真正帮到你。如果你正在使用一个在不应该发生panic时却发生panic的库,你唯一的选择就是彻底重写那个方法。 这可能很简单,或者你可能需要有效地分叉那个库并从头开始。这不是一个解决方案。我们可以一直说“panic不是用来控制流程的”,但如果没有人听,这并没有什么帮助。 - speciesUnknown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接