本文简要介绍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 canonicalize用法及代码示例
- Rust char.is_control用法及代码示例
- Rust char.is_alphanumeric用法及代码示例
- Rust char.len_utf16用法及代码示例
- Rust char.is_digit用法及代码示例
- Rust char.is_ascii_graphic用法及代码示例
- Rust concat用法及代码示例
- Rust char.decode_utf16用法及代码示例
- Rust char.is_uppercase用法及代码示例
- Rust char.to_ascii_lowercase用法及代码示例
- Rust char.is_ascii_uppercase用法及代码示例
- Rust create_dir用法及代码示例
- Rust ctlz用法及代码示例
- Rust channel用法及代码示例
- Rust char.escape_unicode用法及代码示例
- Rust copy_nonoverlapping用法及代码示例
- Rust char.is_alphabetic用法及代码示例
- Rust char.is_ascii_control用法及代码示例
- Rust char.from_u32_unchecked用法及代码示例
- Rust char.is_ascii_alphabetic用法及代码示例
- Rust cttz_nonzero用法及代码示例
- Rust char.eq_ignore_ascii_case用法及代码示例
- Rust current用法及代码示例
- Rust char.is_ascii用法及代码示例
- Rust char.make_ascii_lowercase用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Function std::panic::catch_unwind。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。