當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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