最新Rust錯(cuò)誤處理簡介
Rust錯(cuò)誤處理簡介
以下內(nèi)容總結(jié)自 《The Rust Programing Language》
Rust并不像C++一樣使用try catch的異常機(jī)制來進(jìn)行錯(cuò)誤處理,他將錯(cuò)誤分為可恢復(fù)錯(cuò)誤和不可恢復(fù)錯(cuò)誤兩類,主要使用panic!宏和Result<T,E>類型來進(jìn)行錯(cuò)誤處理。
panic!
panic!用于處理不可恢復(fù)的錯(cuò)誤(例如類似c中的段錯(cuò)誤)。當(dāng)出現(xiàn) panic 時(shí),程序默認(rèn)會開始 展開(unwinding),這意味著 Rust 會回溯棧并清理它遇到的每 一個(gè)函數(shù)的數(shù)據(jù)。
fn main() { panic!("crash and burn"); //打印crash ang burn并清理程序棧, //若指定panic = 'abort'則,直接中止程序,清理工作交給操作系統(tǒng) }
Result
Result用于處理可恢復(fù)的錯(cuò)誤(例如文件打開失敗)。
//T 代表成功時(shí)返回的 Ok 成員中的數(shù)據(jù)的類型 //E 代表失敗時(shí)返回的 Err 成員中的錯(cuò)誤的類型。 enum Result<T, E> { Ok(T), Err(E), } //一個(gè)簡單的使用Result的例子 use std::fs::File; use std::io::ErrorKind; fn main() { let f = File::open("hello.txt"); let f = match f { Ok(file) => file, Err(error) => match error.kind() { ErrorKind::NotFound => match File::create("hello.txt") { Ok(fc) => fc, Err(e) => panic!("Problem creating the file: {:?}", e), }, other_error => { panic!("Problem opening the file: {:?}", other_error) } }, }; } //Result失敗時(shí)調(diào)用panic的簡寫:unwrap和expect //如果 Result 值是成員 Ok,unwrap 會返回 Ok 中的值。如果 Result 是成員 Err,unwrap 會為我們調(diào)用 panic!。 //expect同理 fn main() { let f = File::open("hello.txt").unwrap(); let f = File::open("hello.txt").expect("Failed to open hello.txt"); }
傳播錯(cuò)誤
當(dāng)編寫一個(gè)其實(shí)先會調(diào)用一些可能會失敗的操作的函數(shù)時(shí),除了在這個(gè)函數(shù)中處理錯(cuò)誤外,還可以選擇 讓調(diào)用者知道這個(gè)錯(cuò)誤并決定該如何處理。這被稱為 傳播(propagating)錯(cuò)誤。(即在函數(shù)中向上層返回錯(cuò)誤,交由上層處理),除常規(guī)的return Err外,Rust還提供了?
語法糖來編寫傳播錯(cuò)誤代碼。
//常規(guī)return Err方式此處從略,下面展示?語法 use std::fs::File; use std::io; use std::io::Read; //File :: open 調(diào)用結(jié)尾的 ? 將會把 Ok 中的值返回給變量 f。如果出現(xiàn)了錯(cuò)誤, //? 運(yùn)算符會提早返回整個(gè)函數(shù)并將一些 Err 值傳播給調(diào)用者。同理也適用于 read_to_string 調(diào)用結(jié)尾的 ?。 fn read_username_from_file() -> Result<String, io::Error> { let mut f = File::open("hello.txt")?; let mut s = String::new(); f.read_to_string(&mut s)?; Ok(s) } //甚至可以這樣鏈?zhǔn)秸{(diào)用 fn read_username_from_file() -> Result<String, io::Error> { let mut s = String::new(); File::open("hello.txt")?.read_to_string(&mut s)?; Ok(s) }
注意:
? 運(yùn)算符只能被用于返回值與 ? 作用的值相兼容的函數(shù),所以說對Option或其他類型,如果需要?語法同樣適用
錯(cuò)誤處理指導(dǎo)原則
對于何時(shí)適用panic何時(shí)適用Result,官方給出了如下指導(dǎo)原則:
在當(dāng)有可能會導(dǎo)致有害狀態(tài)的情況下建議使用 panic! —— 在這里,有害狀態(tài)是指當(dāng)一些假設(shè)、保證、協(xié) 議或不可變性被打破的狀態(tài),例如無效的值、自相矛盾的值或者被傳遞了不存在的值 —— 外加如下幾種 情況:
• 有害狀態(tài)是非預(yù)期的行為,與偶爾會發(fā)生的行為相對,比如用戶輸入了錯(cuò)誤格式的數(shù)據(jù)。
• 在此之后代碼的運(yùn)行依賴于不處于這種有害狀態(tài),而不是在每一步都檢查是否有問題。
• 沒有可行的手段來將有害狀態(tài)信息編碼進(jìn)所使用的類型中的情況
然而當(dāng)錯(cuò)誤預(yù)期會出現(xiàn)時(shí),返回 Result 仍要比調(diào)用 panic! 更為合適。這樣的例子包括解析器接收到格式 錯(cuò)誤的數(shù)據(jù),或者 HTTP 請求返回了一個(gè)表明觸發(fā)了限流的狀態(tài)。在這些例子中,應(yīng)該通過返回 Result 來表明失敗預(yù)期是可能的,這樣將有害狀態(tài)向上傳播,調(diào)用者就可以決定該如何處理這個(gè)問題。
當(dāng)代碼對值進(jìn)行操作時(shí),應(yīng)該首先驗(yàn)證值是有效的,并在其無效時(shí) panic!。
到此這篇關(guān)于Rust錯(cuò)誤處理簡介的文章就介紹到這了,更多相關(guān)Rust錯(cuò)誤處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust中類型轉(zhuǎn)換在錯(cuò)誤處理中的應(yīng)用小結(jié)
隨著項(xiàng)目的進(jìn)展,關(guān)于Rust的故事又翻開了新的一頁,今天來到了服務(wù)器端的開發(fā)場景,發(fā)現(xiàn)錯(cuò)誤處理中的錯(cuò)誤類型轉(zhuǎn)換有必要分享一下,對Rust錯(cuò)誤處理相關(guān)知識感興趣的朋友一起看看吧2023-09-09Rust 的 into_owned() 方法實(shí)例詳解
into_owned是Rust語言中std::borrow::Cow 枚舉的一個(gè)方法,into_owned確保了調(diào)用者獲得數(shù)據(jù)的獨(dú)立所有權(quán),無論Cow之前是引用還是已經(jīng)擁有數(shù)據(jù),本文給大家介紹Rust 的 into_owned() 方法,感興趣的的朋友跟隨小編一起看看吧2024-03-03前端基于Rust實(shí)現(xiàn)的Wasm進(jìn)行圖片壓縮的技術(shù)文檔(實(shí)現(xiàn)方案)
在現(xiàn)代Web開發(fā)中,利用Rust編寫的圖片壓縮代碼可以編譯成WebAssembly(Wasm)模塊,Rust的內(nèi)存安全特性和Wasm的跨平臺能力,使得這種方案既高效又安全,對Rust?Wasm圖片壓縮實(shí)現(xiàn)方案感興趣的朋友一起看看吧2024-09-09在win10上使用mingw64編譯器配置Rust開發(fā)環(huán)境和idea 配置Rust 插件
在win10上配置 Rust 開發(fā)環(huán)境(使用 mingw64編譯器)和 idea 配置 Rust 插件的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-03-03Rust生成隨機(jī)數(shù)的項(xiàng)目實(shí)踐
Rust標(biāo)準(zhǔn)庫中并沒有隨機(jī)數(shù)生成器,常見的解決方案是使用rand包,本文主要介紹了Rust生成隨機(jī)數(shù)的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2024-03-03