最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

最新Rust錯誤處理簡介

 更新時間:2022年11月29日 09:10:19   作者:閑魚翻不了身  
Rust并不像C++一樣使用try?catch的異常機(jī)制來進(jìn)行錯誤處理,他將錯誤分為可恢復(fù)錯誤和不可恢復(fù)錯誤兩類,主要使用panic!宏和Result<T,E>類型來進(jìn)行錯誤處理,這篇文章主要介紹了Rust錯誤處理簡介,需要的朋友可以參考下

Rust錯誤處理簡介

以下內(nèi)容總結(jié)自 《The Rust Programing Language》

Rust并不像C++一樣使用try catch的異常機(jī)制來進(jìn)行錯誤處理,他將錯誤分為可恢復(fù)錯誤和不可恢復(fù)錯誤兩類,主要使用panic!宏和Result<T,E>類型來進(jìn)行錯誤處理。

panic!

panic!用于處理不可恢復(fù)的錯誤(例如類似c中的段錯誤)。當(dāng)出現(xiàn) panic 時,程序默認(rèn)會開始 展開(unwinding),這意味著 Rust 會回溯棧并清理它遇到的每 一個函數(shù)的數(shù)據(jù)。

fn main() {
	panic!("crash and burn");
    //打印crash ang burn并清理程序棧,
    //若指定panic = 'abort'則,直接中止程序,清理工作交給操作系統(tǒng)
}

Result

Result用于處理可恢復(fù)的錯誤(例如文件打開失敗)。

//T 代表成功時返回的 Ok 成員中的數(shù)據(jù)的類型
//E 代表失敗時返回的 Err 成員中的錯誤的類型。
enum Result<T, E> {
	Ok(T),
	Err(E),
}

//一個簡單的使用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失敗時調(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");
}

傳播錯誤

當(dāng)編寫一個其實先會調(diào)用一些可能會失敗的操作的函數(shù)時,除了在這個函數(shù)中處理錯誤外,還可以選擇 讓調(diào)用者知道這個錯誤并決定該如何處理。這被稱為 傳播(propagating)錯誤。(即在函數(shù)中向上層返回錯誤,交由上層處理),除常規(guī)的return Err外,Rust還提供了?語法糖來編寫傳播錯誤代碼。

//常規(guī)return Err方式此處從略,下面展示?語法
use std::fs::File;
use std::io;
use std::io::Read;
//File :: open 調(diào)用結(jié)尾的 ? 將會把 Ok 中的值返回給變量 f。如果出現(xiàn)了錯誤,
//? 運算符會提早返回整個函數(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)
}

注意:

? 運算符只能被用于返回值與 ? 作用的值相兼容的函數(shù),所以說對Option或其他類型,如果需要?語法同樣適用

錯誤處理指導(dǎo)原則

對于何時適用panic何時適用Result,官方給出了如下指導(dǎo)原則:

在當(dāng)有可能會導(dǎo)致有害狀態(tài)的情況下建議使用 panic! —— 在這里,有害狀態(tài)是指當(dāng)一些假設(shè)、保證、協(xié) 議或不可變性被打破的狀態(tài),例如無效的值、自相矛盾的值或者被傳遞了不存在的值 —— 外加如下幾種 情況:

• 有害狀態(tài)是非預(yù)期的行為,與偶爾會發(fā)生的行為相對,比如用戶輸入了錯誤格式的數(shù)據(jù)。

• 在此之后代碼的運行依賴于不處于這種有害狀態(tài),而不是在每一步都檢查是否有問題。

• 沒有可行的手段來將有害狀態(tài)信息編碼進(jìn)所使用的類型中的情況

然而當(dāng)錯誤預(yù)期會出現(xiàn)時,返回 Result 仍要比調(diào)用 panic! 更為合適。這樣的例子包括解析器接收到格式 錯誤的數(shù)據(jù),或者 HTTP 請求返回了一個表明觸發(fā)了限流的狀態(tài)。在這些例子中,應(yīng)該通過返回 Result 來表明失敗預(yù)期是可能的,這樣將有害狀態(tài)向上傳播,調(diào)用者就可以決定該如何處理這個問題。

當(dāng)代碼對值進(jìn)行操作時,應(yīng)該首先驗證值是有效的,并在其無效時 panic!。

到此這篇關(guān)于Rust錯誤處理簡介的文章就介紹到這了,更多相關(guān)Rust錯誤處理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文弄懂Rust之切片

    一文弄懂Rust之切片

    在Rust中,切片是一種非常重要的引用類型,它允許你安全地引用一段連續(xù)內(nèi)存中的數(shù)據(jù),而不需要擁有這些數(shù)據(jù)的所有權(quán),本文主要介紹了Rust之切片,感興趣的可以了解一下
    2024-03-03
  • 詳解Rust中三種循環(huán)(loop,while,for)的使用

    詳解Rust中三種循環(huán)(loop,while,for)的使用

    我們常常需要重復(fù)執(zhí)行同一段代碼,針對這種場景,Rust?提供了多種循環(huán)(loop)工具。一個循環(huán)會執(zhí)行循環(huán)體中的代碼直到結(jié)尾,并緊接著回到開頭繼續(xù)執(zhí)行。而?Rust?提供了?3?種循環(huán):loop、while?和?for,下面逐一講解
    2022-09-09
  • rust閉包的使用

    rust閉包的使用

    閉包在Rust中是非常強(qiáng)大的功能,允許你編寫更靈活和表達(dá)性的代碼,本文主要介紹了rust閉包的使用,具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • 使用vscode配置Rust運行環(huán)境全過程

    使用vscode配置Rust運行環(huán)境全過程

    VS Code對Rust有著較完備的支持,這篇文章主要給大家介紹了關(guān)于使用vscode配置Rust運行環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • 利用rust實現(xiàn)一個命令行工具

    利用rust實現(xiàn)一個命令行工具

    這篇文章主要為大家詳細(xì)介紹了如何使用?Rust?和?clap?4.4.0?創(chuàng)建一個命令行工具?my_dev_tool,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考下
    2023-12-12
  • Rust中引用和指針的區(qū)別詳解

    Rust中引用和指針的區(qū)別詳解

    在 Rust 中,指針和引用都可以用來指向內(nèi)存中的某個值,它們之間的主要區(qū)別在于它們的安全性和生命周期保證,本文將通過一個簡單的示例給大家介紹一下Rust中引用和指針的區(qū)別,需要的朋友可以參考下
    2023-08-08
  • Rust初體驗:手把手教你構(gòu)建‘Hello,?World!’

    Rust初體驗:手把手教你構(gòu)建‘Hello,?World!’

    "準(zhǔn)備好了嗎?一起踏上Rust編程語言的精彩旅程!在這篇「Rust初體驗」中,我們將手把手教你構(gòu)建經(jīng)典程序“Hello,?World!”,感受Rust的強(qiáng)大與安全,短短幾行代碼,就能讓你對這個系統(tǒng)級語言的魅力一探究竟!快加入吧,驚喜等你發(fā)現(xiàn)!"
    2024-01-01
  • Rust中FFI編程知識點整理總結(jié)(推薦)

    Rust中FFI編程知識點整理總結(jié)(推薦)

    這篇文章主要介紹了Rust中FFI編程知識點整理總結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 一文弄懂rust聲明宏

    一文弄懂rust聲明宏

    Rust支持兩種宏,一種是聲明宏,一種是過程宏,本文主要介紹了一文弄懂rust聲明宏,通過聲明宏可以減少一些樣板代碼,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • rust多個mod文件引用和文件夾mod使用注意事項小結(jié)

    rust多個mod文件引用和文件夾mod使用注意事項小結(jié)

    在 Rust 項目中,可以使用 mod 關(guān)鍵字將一個文件夾或一個 rs 文件作為一個模塊引入到當(dāng)前文件中,本文給大家介紹rust多個mod文件引用和文件夾mod使用注意事項小結(jié),感興趣的朋友跟隨小編一起看看吧
    2024-03-03

最新評論

汉阴县| 双桥区| 大同市| 米易县| 通江县| 蒙城县| 醴陵市| 白山市| 将乐县| 正蓝旗| 汤原县| 滦平县| 和顺县| 溧阳市| 高雄县| 阿鲁科尔沁旗| 泉州市| 容城县| 和田市| 正镶白旗| 印江| 正阳县| 昭平县| 烟台市| 朝阳县| 酒泉市| 雷波县| 赞皇县| 曲松县| 信宜市| 嘉定区| 蒙山县| 舒兰市| 茶陵县| 昭平县| 库尔勒市| 井陉县| 辉南县| 金华市| 南昌市| 汉寿县|