020 Rust死靈書之展開

linghuyichong發表於2021-05-07

本系列錄製的影片主要放在B站上Rust死靈書學習影片

Rust 死靈書相關的原始碼資料在github.com/anonymousGiga/Rustonomi...

  • 有些值可以為空,則使用Option;
  • 如果發生了錯誤,而錯誤可以被正常處理,用Result;
  • 如果發生了錯誤,但是沒辦法正常處理,就讓執行緒Panic;
  • 如果發生了更嚴重的問題,則終止(abort)程式。

在Rust中,Panic只能被任務的所有者捕獲,而捕獲後必須立即對它進行相應處理,否則任務會自己停止。

  • 捕獲panic:catch_panic可以在不啟動一個執行緒的情況下捕獲panic,示例如下:
use std::panic;

fn main() {
    let result = panic::catch_unwind(|| {
        println!("hello!");
    }); 
    assert!(result.is_ok());
    let result = panic::catch_unwind(|| {
        panic!("oh no!");
    }); 
    assert!(result.is_err());

    println!("Hello, world!");
}
  • Rust的展開方式沒有試圖和其它語言的展開方式相容,因此,從其它語言展開Rust的棧或者從Rust展開其它語言的棧,屬於未定義行為。所以必須在進入FFI之前捕獲所有的Panic!
本作品採用《CC 協議》,轉載必須註明作者和本文連結
令狐一衝

相關文章