本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。