最近發布的Rust 1.9增加了一個新的異常處理API,讓開發者在處理跨線程異常傳播的時候能夠增加更多的控制。此外新版本還提升了變量判等時的編譯性能。
正如前面所提到的,std::panic增加了一個新的catch_unwindAPI,Rust使用它來處理異常,同時允許開發者更好地控制由異常觸發的堆棧展開過程。Rust在這種場景下的哲學是“快速失敗”,也就是在展開堆棧之后停止喚起的線程,但是其他線程不受影響,可以繼續運行,直到它們試圖與出錯的線程通信為止,只有當需要與出錯的線程通信時才需要做一些恢復工作。通過使用catch_unwind,開發者能夠捕獲panic并將其轉換成失敗線程中的普通錯誤:
let result = panic::catch_unwind(|| { panic!("oh no!");});assert!(result.is_err());該功能在下面兩種場景中非常有用:
將Rust嵌入其他語言的時候。在這種情況下unwinding很有可能會在語言邊界處產生分割故障。 當創建類庫來管理線程的時候。在這種情況下,最好是將錯誤通知到客戶端而不是停止失敗的線程。值得注意的是,堆棧展開目前是Rust處理panic的唯一策略,但是未來這種情況會改變。確實,通過一種新的“終止”策略從而避免堆棧展開的成本可能更可取。
新的Rust版本還提升了兩個變量判等時的編譯性能。PR的提交者Markus Westerlind聲稱在某些情況下提升非常明顯,復雜性從O(n!)降低到了O(n)。正如Westerlind在Reddit上所解釋的,盡管n通常都非常小,但是代碼中細微的差別都有可能使得n膨脹。在這些場景下,恰如Westerlind的combine庫所展示的,Rust1.9在性能上有極大的提升。
此外,Rust1.9還提升了許多庫函數的穩定性,包括網絡、編碼以及指針處理函數。
如果你想了解更多信息可以查看Rust1.9的官方聲明。
查看英文原文:Rust 1.9 Improves Error Handling and Compile Time