全面講解在Rust中處理錯(cuò)誤的有效方法
譯文審校 | 重樓
51CTO讀者成長(zhǎng)計(jì)劃社群招募,咨詢小助手(微信號(hào):TTalkxiaozhuli)
錯(cuò)誤不可避免,可能由于各種原因而發(fā)生:從無效的用戶輸入到網(wǎng)絡(luò)故障、硬件故障或編程錯(cuò)誤,不一而足。錯(cuò)誤處理是檢測(cè)和報(bào)告錯(cuò)誤并從中恢復(fù)的機(jī)制,以防程序崩潰或數(shù)據(jù)損壞。
有效的錯(cuò)誤處理在Rust中至關(guān)重要。它讓您可以創(chuàng)建穩(wěn)健可靠的應(yīng)用程序,可以處理意外的錯(cuò)誤和故障。Rust的錯(cuò)誤處理機(jī)制讓您可以開發(fā)更易于維護(hù)的有彈性且安全的程序。
一、Rust中的錯(cuò)誤類型
Rust有一個(gè)豐富的類型系統(tǒng),可以根據(jù)錯(cuò)誤的類型熟練處理錯(cuò)誤。Rust豐富的錯(cuò)誤類型系統(tǒng)較之傳統(tǒng)錯(cuò)誤處理方法具有的好處不可低估。錯(cuò)誤類型系統(tǒng)提供了改進(jìn)的類型安全、可組合性、表達(dá)性和可調(diào)試性。
下面是Rust中常見的錯(cuò)誤類型:
- std::io::Error類型表示I/O錯(cuò)誤,比如未找到文件、權(quán)限被拒絕或到達(dá)文件結(jié)束。
- std::num::ParseIntError類型表示發(fā)生字符串到整數(shù)解析操作所出現(xiàn)的錯(cuò)誤。
- std::option::NoneError類型表示打開空選項(xiàng)引起的錯(cuò)誤。
- std::result:: result <T, E>類型是一個(gè)泛型Result類型,可以用來表示任何錯(cuò)誤。
每種錯(cuò)誤類型都有各自的一組方法和特征,用于以特定的方式來處理它。
下面是Rust中文件讀取操作的錯(cuò)誤處理示例:
read_file函數(shù)讀取指定路徑中文件的內(nèi)容,并將其作為字符串返回。如果文件打開或讀取操作失敗,它就返回std::io::Error。?操作符傳送錯(cuò)誤,并將錯(cuò)誤作為Result返回。
二、Rust中的錯(cuò)誤處理機(jī)制
確保Rust安全性的一個(gè)關(guān)鍵特征是其錯(cuò)誤處理機(jī)制。Rust中有四種主要的錯(cuò)誤處理機(jī)制:Result類型、Option類型、panic!宏和Error特征。
Result類型和Option類型支持結(jié)構(gòu)化錯(cuò)誤處理。您可以使用panic!宏來處理不可恢復(fù)的錯(cuò)誤。Error特征讓您可以定義自定義錯(cuò)誤類型和自定義錯(cuò)誤處理。
1.Result類型
Result類型是一個(gè)內(nèi)置類型,表示可能失敗的操作的結(jié)果。它有兩個(gè)變量:Ok變量,表示成功并含有一個(gè)值;以及Err變量,表示失敗并含有一個(gè)錯(cuò)誤值。
下面介紹如何使用Result類型打開一個(gè)文件并讀取其內(nèi)容:
read_file函數(shù)接受文件路徑,并返回Result<String, std::io::Error>錯(cuò)誤。如果文件讀取或打開操作失敗,函數(shù)返回Err值。否則,函數(shù)返回Ok值。在main函數(shù)中,match語句處理Result值,并根據(jù)文件操作的情況打印輸出結(jié)果。
2.Option類型
Option類型是表示值存在或不存在的內(nèi)置類型。Option類型有兩個(gè)變體。Some表示值,None表示沒有值。
下面介紹如何使用Option類型來檢索向量的第一個(gè)元素。
get_first_element函數(shù)返回Option<T>類型。如果向量為空,函數(shù)返回None;否則,函數(shù)返回含有向量第一個(gè)元素的Some。在main函數(shù)中,match語句處理Option值。如果Option值為Some,函數(shù)打印輸出第一個(gè)元素。否則,函數(shù)打印輸出一條消息,表明該向量為空。
3.panic!宏
panic!宏提供了在Rust中處理不可恢復(fù)的錯(cuò)誤的功能。一調(diào)用panic!宏,它打印輸出錯(cuò)誤消息并終止程序。
下面這個(gè)示例表明使用panic!宏來表示函數(shù)擁有無效參數(shù)。
divide函數(shù)檢查除數(shù)是否為零;如果除數(shù)為零,函數(shù)調(diào)用帶有錯(cuò)誤消息的panic!宏;否則,函數(shù)計(jì)算并返回結(jié)果。
main函數(shù)調(diào)用帶有無效參數(shù)的divide函數(shù)來觸發(fā)panic!宏。
下面是錯(cuò)誤信息:
4.Error特征
Error特征是定義錯(cuò)誤類型行為的內(nèi)置特征。Error特征提供了定義自定義錯(cuò)誤類型和自定義錯(cuò)誤處理的功能。
下面是定義自定義錯(cuò)誤類型的示例,該錯(cuò)誤類型表示文件未找到錯(cuò)誤。
自定義錯(cuò)誤類型是FileNotFound構(gòu)件。該類型含有文件路徑,F(xiàn)ileNotFound類型實(shí)現(xiàn)了Display特征以返回對(duì)用戶友好的錯(cuò)誤消息,并實(shí)現(xiàn)了Error特征以表明這是錯(cuò)誤類型。
在read_file函數(shù)中,F(xiàn)ileNotFound錯(cuò)誤類型表示文件未找到錯(cuò)誤,map_err方法將std::io:: Error轉(zhuǎn)換成FileNotFound錯(cuò)誤。最后,Box<dyn Error>類型允許函數(shù)返回實(shí)現(xiàn)Error特征的任何類型。
main函數(shù)調(diào)用帶有文件路徑的read_file函數(shù);如果找到文件,將其內(nèi)容打印輸出到控制臺(tái)。不然,它打印輸出錯(cuò)誤消息。
下面是一個(gè)不存在的文件的結(jié)果:
三、可以依靠Rust的
所有權(quán)模型來確保程序安全
與Rust出色的錯(cuò)誤處理機(jī)制相結(jié)合,Rust還利用了所有權(quán)模型來幫助確保程序是內(nèi)存安全的。
Rust在程序運(yùn)行前的編譯時(shí),使用借用檢查器確保所有權(quán)規(guī)則。
原文鏈接:https://www.makeuseof.com/rust-error-handling-approaches/