当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust catch_unwind用法及代码示例


本文简要介绍rust语言中 Function std::panic::catch_unwind 的用法。

用法

pub fn catch_unwind<F: FnOnce() -> R + UnwindSafe, R>(f: F) -> Result<R>

调用闭包,如果发生Panics,则捕获解除Panics的原因。

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

从 Rust 代码展开到外部代码当前是未定义的行为,因此当从另一种语言(通常是 C)调用 Rust 时,此函数特别有用。这可以运行任意 Rust 代码,捕获Panics并允许优雅地处理错误。

这是不是建议将此函数用于一般的 try/catch 机制。这std::thread::Resulttype 更适合用于经常失败的函数。此外,此函数不能保证捕获所有Panics,请参阅下面的“Notes”部分。

提供的闭包需要遵守 UnwindSafe 特征,以确保所有捕获的变量都可以安全地跨越此边界。此绑定的目的是在类型系统中对 exception safety 的概念进行编码。此函数的大多数用法不需要担心此限制,因为程序自然是在没有 unsafe 代码的情况下安全展开的。如果出现问题,可以使用 AssertUnwindSafe 包装器结构来快速断言此处的用法确实是展开安全的。

注意

注意这个函数可能无法捕捉到所有Panics在铁锈中。 Rust 中的Panics并不总是通过展开来实现,但也可以通过中止进程来实现。这个函数只要捕获正在解除的Panics,而不是那些中止进程的Panics。

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

例子

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());

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Function std::panic::catch_unwind。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。