在Rust中編寫(xiě)自定義Error的詳細(xì)代碼
前言
之前我們聊過(guò),Result<T, E> 類型可以方便地用于錯(cuò)誤傳導(dǎo),Result<T, E>是模板類型,實(shí)例化后可以是各種類型,但 Rust 要求傳導(dǎo)的 Result 中的 E 是相同類型的,或者能夠自動(dòng)轉(zhuǎn)化為相同類型。比如,下面這段代碼編譯就會(huì)報(bào)錯(cuò)。所以我們需要編寫(xiě)自己的 Error 類型,以同時(shí)包含系統(tǒng)錯(cuò)誤和具體業(yè)務(wù)錯(cuò)誤。
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 表示一種錯(cuò)誤,Rust 標(biāo)準(zhǔn)庫(kù)已經(jīng)定義一系列 Error,主要是 io Error。它的定義如下:
pub struct Error {
repr: Repr,
}
我們可以通過(guò)它的關(guān)聯(lián)函數(shù) new,from,other,配合 ErrorKind 來(lái)生成一個(gè)io Error 用于Reuslt。
自定義 Error
我們要定義一個(gè)自己的 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)中,我們通過(guò)手動(dòng)方式將 std::io::Error 轉(zhuǎn)化為 MyError。也可以通過(guò)實(shí)現(xiàn) From trait 來(lái)自動(dòng)實(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ù)就可以簡(jiǎn)化如下:
fn read_fs() -> Result<(), MyError> {
File::open("abc.txt")?;
Ok(())
}
現(xiàn)在還有一個(gè)問(wèn)題,在 main 函數(shù)中,我們無(wú)法打印 e 信息。通過(guò)簡(jiǎn)單的為 WorkError 和 MyError 類型增加 #[derive(Debug)] 聲明,就可以直接打印 e 信息。
到此這篇關(guān)于在Rust中編寫(xiě)自定義Error的詳細(xì)代碼的文章就介紹到這了,更多相關(guān)Rust編寫(xiě)自定義Error內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Rust動(dòng)態(tài)調(diào)用字符串定義的Rhai函數(shù)方式
Rust中使用Rhai動(dòng)態(tài)調(diào)用字符串定義的函數(shù),通過(guò)eval_expression_with_scope實(shí)現(xiàn),但參數(shù)傳遞和函數(shù)名處理有局限性,使用FnCall功能更健壯,但更復(fù)雜,總結(jié)提供了更通用的方法,但需要處理更多錯(cuò)誤情況2025-02-02
Rust使用Channel實(shí)現(xiàn)跨線程傳遞數(shù)據(jù)
消息傳遞是一種很流行且能保證安全并發(fā)的技術(shù),Rust也提供了一種基于消息傳遞的并發(fā)方式,在rust里使用標(biāo)準(zhǔn)庫(kù)提供的Channel來(lái)實(shí)現(xiàn),下面我們就來(lái)學(xué)習(xí)一下如何使用Channel實(shí)現(xiàn)跨線程傳遞數(shù)據(jù)吧2023-12-12
Rust中FFI編程知識(shí)點(diǎn)整理總結(jié)(推薦)
這篇文章主要介紹了Rust中FFI編程知識(shí)點(diǎn)整理總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09
rust?創(chuàng)建多線程web?server的詳細(xì)過(guò)程
web?server?中主要的兩個(gè)協(xié)議是?http?和?tcp,tcp?是底層協(xié)議,http?是構(gòu)建在?tcp?之上的,本篇文章重點(diǎn)給大家介紹rust?創(chuàng)建多線程web?server的詳細(xì)過(guò)程,感興趣的朋友跟隨小編一起看看吧2023-11-11
rust標(biāo)準(zhǔn)庫(kù)std::env環(huán)境相關(guān)的常量
在本章節(jié)中, 我們探討了Rust處理命令行參數(shù)的常見(jiàn)的兩種方式和處理環(huán)境變量的兩種常見(jiàn)方式, 拋開(kāi)Rust的語(yǔ)法, 實(shí)際上在命令行參數(shù)的處理方式上, 與其它語(yǔ)言大同小異, 可能影響我們習(xí)慣的也就只剩下語(yǔ)法,本文介紹rust標(biāo)準(zhǔn)庫(kù)std::env的相關(guān)知識(shí),感興趣的朋友一起看看吧2024-03-03
Rust使用lettre實(shí)現(xiàn)郵件發(fā)送功能
這篇文章主要為大家詳細(xì)介紹了Rust如何使用lettre實(shí)現(xiàn)郵件發(fā)送功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-11-11
rust交叉編譯問(wèn)題及報(bào)錯(cuò)解析
這篇文章主要為大家介紹了rust交叉編譯問(wèn)題及報(bào)錯(cuò)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07

