在Rust中編寫自定義Error的詳細(xì)代碼
前言
之前我們聊過,Result<T, E> 類型可以方便地用于錯誤傳導(dǎo),Result<T, E>是模板類型,實(shí)例化后可以是各種類型,但 Rust 要求傳導(dǎo)的 Result 中的 E 是相同類型的,或者能夠自動轉(zhuǎn)化為相同類型。比如,下面這段代碼編譯就會報錯。所以我們需要編寫自己的 Error 類型,以同時包含系統(tǒng)錯誤和具體業(yè)務(wù)錯誤。
use std::io; use std::fs::{File}; fn read_fs() -> io::Result<()> { File::open("abc.txt")?; Ok(()) } fn user_err() -> Result<u32, String> { Err(String::from("test faill")) } fn test() -> Result<u32, String>{ read_fs()?; test()?; } pub fn main() { test(); }
系統(tǒng)Error
在 Result<T, E> 中,E 表示一種錯誤,Rust 標(biāo)準(zhǔn)庫已經(jīng)定義一系列 Error,主要是 io Error。它的定義如下:
pub struct Error { repr: Repr, }
我們可以通過它的關(guān)聯(lián)函數(shù) new,from,other,配合 ErrorKind 來生成一個io Error 用于Reuslt。
自定義 Error
我們要定義一個自己的 Error 類型,它既包含系統(tǒng)的 io Error,也包含業(yè)務(wù) Error,定義如下
// 業(yè)務(wù) Error 定義 enum WorkError { WorkErrorFirst, WorkErrorSecond, WorkErrorThird, } // 復(fù)合 Error 定義 enum MyError { IoErr(std::io::Error), WorkErr(WorkError) }
使用 MyError
fn read_fs() -> Result<(), MyError> { let ret = File::open("abc.txt"); if let Err(e) = ret { return Err(MyError::IoErr(e)); } else { println!("ret = {ret:?}"); } Ok(()) } fn user_err() -> Result<(), MyError> { Err(MyError::WorkErr(WorkError::WorkErrorSecond)) } fn test() -> Result<(), MyError>{ read_fs()?; user_err()?; Ok(()) } pub fn main() { let ret = test(); match ret { Ok(_) => { println!("run test success"); } Err(e) => { println!("run test fail"); } } }
在上述實(shí)現(xiàn)中,我們通過手動方式將 std::io::Error 轉(zhuǎn)化為 MyError。也可以通過實(shí)現(xiàn) From trait 來自動實(shí)現(xiàn)這種轉(zhuǎn)化。
impl From<std::io::Error> for MyError { fn from(err: std::io::Error) -> Self { MyError::IoErr(err) } } // 這樣,read_fs 函數(shù)就可以簡化如下: fn read_fs() -> Result<(), MyError> { File::open("abc.txt")?; Ok(()) }
現(xiàn)在還有一個問題,在 main 函數(shù)中,我們無法打印 e 信息。通過簡單的為 WorkError 和 MyError 類型增加 #[derive(Debug)] 聲明,就可以直接打印 e 信息。
到此這篇關(guān)于在Rust中編寫自定義Error的詳細(xì)代碼的文章就介紹到這了,更多相關(guān)Rust編寫自定義Error內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust中類型轉(zhuǎn)換在錯誤處理中的應(yīng)用小結(jié)
隨著項(xiàng)目的進(jìn)展,關(guān)于Rust的故事又翻開了新的一頁,今天來到了服務(wù)器端的開發(fā)場景,發(fā)現(xiàn)錯誤處理中的錯誤類型轉(zhuǎn)換有必要分享一下,對Rust錯誤處理相關(guān)知識感興趣的朋友一起看看吧2023-09-09Go調(diào)用Rust方法及外部函數(shù)接口前置
這篇文章主要為大家介紹了Go調(diào)用Rust方法及外部函數(shù)接口前置示例實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06vscode搭建rust開發(fā)環(huán)境的圖文教程
Rust 是一種系統(tǒng)編程語言,它專注于內(nèi)存安全、并發(fā)和性能,本文主要介紹了vscode搭建rust開發(fā)環(huán)境的圖文教程,具有一定的參考價值,感興趣的可以了解一下2024-03-03Rust?連接?PostgreSQL?數(shù)據(jù)庫的詳細(xì)過程
這篇文章主要介紹了Rust?連接?PostgreSQL?數(shù)據(jù)庫的完整代碼,本文圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01