欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Rust中編寫自定義Error的詳細(xì)代碼

 更新時間:2024年01月26日 09:42:29   作者:歸云十九少  
Result<T, E> 類型可以方便地用于錯誤傳導(dǎo),Result<T, E>是模板類型,實(shí)例化后可以是各種類型,但 Rust 要求傳導(dǎo)的 Result 中的 E 是相同類型的,所以我們需要編寫自己的 Error 類型,本文給大家介紹了在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();
}

image.png

系統(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語言數(shù)據(jù)類型的具體使用

    Rust語言數(shù)據(jù)類型的具體使用

    在Rust中,每個值都有一個明確的數(shù)據(jù)類型,本文主要介紹了Rust語言數(shù)據(jù)類型的具體使用,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Rust中類型轉(zhuǎn)換在錯誤處理中的應(yīng)用小結(jié)

    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-09
  • Go調(diào)用Rust方法及外部函數(shù)接口前置

    Go調(diào)用Rust方法及外部函數(shù)接口前置

    這篇文章主要為大家介紹了Go調(diào)用Rust方法及外部函數(shù)接口前置示例實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Rust中引用的具體使用

    Rust中引用的具體使用

    在Rust語言中,引用機(jī)制是其所有權(quán)系統(tǒng)的重要組成部分,ust提供了兩種類型的引用,不可變引用和可變引用,本文就來詳細(xì)的介紹一下這兩種的用法,感興趣的可以了解一下
    2024-03-03
  • vscode搭建rust開發(fā)環(huán)境的圖文教程

    vscode搭建rust開發(fā)環(huán)境的圖文教程

    Rust 是一種系統(tǒng)編程語言,它專注于內(nèi)存安全、并發(fā)和性能,本文主要介紹了vscode搭建rust開發(fā)環(huán)境的圖文教程,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Rust之Substrate框架中的pallet詳解

    Rust之Substrate框架中的pallet詳解

    Pallet是Substrate區(qū)塊鏈的基礎(chǔ)模塊,它定義了區(qū)塊鏈的業(yè)務(wù)邏輯和狀態(tài)轉(zhuǎn)換規(guī)則。開發(fā)人員可以使用現(xiàn)有的Pallet來快速構(gòu)建區(qū)塊鏈,也可以開發(fā)自定義的Pallet來實(shí)現(xiàn)特定的功能,感興趣的小伙伴可以參考閱讀下
    2023-05-05
  • Rust如何使用config配置API

    Rust如何使用config配置API

    這篇文章主要介紹了Rust如何使用config配置API,這里記錄了如何聲明配置類型,讀取配置,通過環(huán)境變量來覆蓋配置值等開發(fā)中常見的動作,需要的朋友可以參考下
    2023-11-11
  • Rust中的函數(shù)指針詳解

    Rust中的函數(shù)指針詳解

    Rust是一種現(xiàn)代的系統(tǒng)編程語言,它支持函數(shù)指針。函數(shù)指針是指向函數(shù)的指針,可以將函數(shù)作為參數(shù)傳遞給其他函數(shù)或存儲在變量中。Rust中的函數(shù)指針可以用于實(shí)現(xiàn)回調(diào)函數(shù)、動態(tài)分發(fā)和多態(tài)等功能。本文將介紹Rust中的函數(shù)指針的基本用法和高級用法。
    2023-05-05
  • 利用Rust編寫一個簡單的字符串時鐘

    利用Rust編寫一個簡單的字符串時鐘

    這篇文章主要為大家詳細(xì)介紹了一個用rust寫的一個簡單的練手的demo,一個字符串時鐘,在終端用字符串方式顯示當(dāng)前時間,感興趣的小伙伴可以了解一下
    2022-12-12
  • Rust?連接?PostgreSQL?數(shù)據(jù)庫的詳細(xì)過程

    Rust?連接?PostgreSQL?數(shù)據(jù)庫的詳細(xì)過程

    這篇文章主要介紹了Rust?連接?PostgreSQL?數(shù)據(jù)庫的完整代碼,本文圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-01-01

最新評論