Function std::panic::catch_unwind

1.9.0 · source ·
pub fn catch_unwind<F: FnOnce() -> R + UnwindSafe, R>(f: F) -> Result<R>
Expand description

调用一个闭包,如果发生,则捕获展开 panic 的原因。

如果闭包不是 panic,则此函数将返回 Ok,并返回闭包的结果; 如果闭包 panics,则此函数将返回 Err(cause)。 返回的 cause 是最初调用 panic 的对象。

unwind 当前从 Rust 代码转换为外来代码是未定义的行为,因此当从另一种语言 (通常为 C) 调用 Rust 时,此函数特别有用。 这可以运行任意的 Rust 代码,捕获 panic 并允许对错误进行适当的处理。

不建议将此函数用于一般的 try/catch 机制。Result 类型更适合用于经常失败的函数。 此外,不能保证此函数可以捕获所有 panics,请参见下面的 “Notes” 部分。

提供的闭包必须遵守 UnwindSafe trait,以确保所有捕获的变量都可以安全越过此边界。 此绑定的目的是在类型系统中对 异常安全 的概念进行编码。 此函数的大多数用法都不必担心此绑定,因为没有 unsafe 代码的程序自然是 unwind 安全的。 如果出现问题,可以使用 AssertUnwindSafe 包装器结构体快速断言此处的使用确实是 unwind 安全的。

Notes

请注意,此函数可能无法捕获 Rust 中的所有 panics。Rust 中的 panic 并不总是通过展开来实现,但是也可以通过中止进程来实现。

该函数 捕获展开 panics,而不是那些中止进程的 panics。

请注意,如果已设置自定义 panic 钩子,它将在 panic 被捕获之前调用,在展开之前。

另请注意,使用外部异常 (例如,展开为 Rust 代码) 从 C++ 代码引发的异常) 是未定义的行为。

Examples

use std::panic;

let result = panic::catch_unwind(|| {
    println!("hello!");
});
assert!(result.is_ok());

let result = panic::catch_unwind(|| {
    panic!("oh no!");
});
assert!(result.is_err());
Run