亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

最新Rust錯誤處理簡介

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

Rust錯誤處理簡介

以下內容總結自 《The Rust Programing Language》

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

panic!

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

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

Result

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

//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失敗時調用panic的簡寫:unwrap和expect
//如果 Result 值是成員 Ok,unwrap 會返回 Ok 中的值。如果 Result 是成員 Err,unwrap 會為我們調用 panic!。
//expect同理
fn main() {
	let f = File::open("hello.txt").unwrap();
    let f = File::open("hello.txt").expect("Failed to open hello.txt");
}

傳播錯誤

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

//常規(guī)return Err方式此處從略,下面展示?語法
use std::fs::File;
use std::io;
use std::io::Read;
//File :: open 調用結尾的 ? 將會把 Ok 中的值返回給變量 f。如果出現(xiàn)了錯誤,
//? 運算符會提早返回整個函數(shù)并將一些 Err 值傳播給調用者。同理也適用于 read_to_string 調用結尾的 ?。
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)
}
//甚至可以這樣鏈式調用
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或其他類型,如果需要?語法同樣適用

錯誤處理指導原則

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

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

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

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

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

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

當代碼對值進行操作時,應該首先驗證值是有效的,并在其無效時 panic!。

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

相關文章

  • Tauri?打開本地文件踩坑分析解決

    Tauri?打開本地文件踩坑分析解決

    這篇文章主要為大家介紹了Tauri?打開本地文件踩坑分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Rust?中?Mutex?的基本用法

    Rust?中?Mutex?的基本用法

    Rust?標準庫中的?Mutex?結構體位于?std::sync::Mutex?中,它提供了線程安全的數(shù)據(jù)訪問,Mutex?保證了在同一時間只有一個線程可以訪問被鎖定的數(shù)據(jù),這篇文章主要介紹了Rust?中?Mutex?的基本用法,需要的朋友可以參考下
    2024-05-05
  • Rust中類型轉換在錯誤處理中的應用小結

    Rust中類型轉換在錯誤處理中的應用小結

    隨著項目的進展,關于Rust的故事又翻開了新的一頁,今天來到了服務器端的開發(fā)場景,發(fā)現(xiàn)錯誤處理中的錯誤類型轉換有必要分享一下,對Rust錯誤處理相關知識感興趣的朋友一起看看吧
    2023-09-09
  • 詳解Rust 修改源

    詳解Rust 修改源

    這篇文章主要介紹了Rust 修改源的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • Rust 的 into_owned() 方法實例詳解

    Rust 的 into_owned() 方法實例詳解

    into_owned是Rust語言中std::borrow::Cow 枚舉的一個方法,into_owned確保了調用者獲得數(shù)據(jù)的獨立所有權,無論Cow之前是引用還是已經(jīng)擁有數(shù)據(jù),本文給大家介紹Rust 的 into_owned() 方法,感興趣的的朋友跟隨小編一起看看吧
    2024-03-03
  • 前端基于Rust實現(xiàn)的Wasm進行圖片壓縮的技術文檔(實現(xiàn)方案)

    前端基于Rust實現(xiàn)的Wasm進行圖片壓縮的技術文檔(實現(xiàn)方案)

    在現(xiàn)代Web開發(fā)中,利用Rust編寫的圖片壓縮代碼可以編譯成WebAssembly(Wasm)模塊,Rust的內存安全特性和Wasm的跨平臺能力,使得這種方案既高效又安全,對Rust?Wasm圖片壓縮實現(xiàn)方案感興趣的朋友一起看看吧
    2024-09-09
  • 在win10上使用mingw64編譯器配置Rust開發(fā)環(huán)境和idea 配置Rust 插件

    在win10上使用mingw64編譯器配置Rust開發(fā)環(huán)境和idea 配置Rust 插件

    在win10上配置 Rust 開發(fā)環(huán)境(使用 mingw64編譯器)和 idea 配置 Rust 插件的相關知識,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-03-03
  • Rust生成隨機數(shù)的項目實踐

    Rust生成隨機數(shù)的項目實踐

    Rust標準庫中并沒有隨機數(shù)生成器,常見的解決方案是使用rand包,本文主要介紹了Rust生成隨機數(shù)的項目實踐,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • rust文件讀寫的實現(xiàn)示例

    rust文件讀寫的實現(xiàn)示例

    Rust語言提供了強大的文件讀寫庫,使得開發(fā)者可以更加方便地進行文件操作,并且其安全性可以有效避免文件操作中可能出現(xiàn)的風險,本文就來詳細的介紹了rust文件讀寫的實現(xiàn)示例,感興趣的可以了解一下
    2023-12-12
  • Rust文本處理快速入門

    Rust文本處理快速入門

    編程過程中有許多類型的數(shù)據(jù)要處理,其中文本處理必不可少,本文主要介紹了Rust文本處理快速入門 ,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧
    2024-03-03

最新評論