最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

image.png

系統(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延遲5秒鎖屏的實(shí)現(xiàn)代碼

    rust延遲5秒鎖屏的實(shí)現(xiàn)代碼

    這篇文章主要介紹了rust延遲5秒鎖屏的實(shí)現(xiàn)代碼,文中通過(guò)實(shí)例代碼也介紹了rust計(jì)算程序運(yùn)行時(shí)間的方法,代碼簡(jiǎn)單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • Rust動(dòng)態(tài)調(diào)用字符串定義的Rhai函數(shù)方式

    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ù)

    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é)(推薦)

    這篇文章主要介紹了Rust中FFI編程知識(shí)點(diǎn)整理總結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • rust?創(chuàng)建多線程web?server的詳細(xì)過(guò)程

    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)的常量

    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模塊關(guān)鍵詞和哈希表詳解

    Rust模塊關(guān)鍵詞和哈希表詳解

    文章介紹了Rust編程語(yǔ)言中模塊系統(tǒng)、路徑控制、as關(guān)鍵字、外部包的使用以及哈希表的操作,主要涵蓋了如何通過(guò)pub關(guān)鍵字控制模塊和結(jié)構(gòu)體的可見(jiàn)性,文章還詳細(xì)講解了哈希表的創(chuàng)建、訪問(wèn)、所有權(quán)轉(zhuǎn)移、更新操作,感興趣的朋友一起看看吧
    2026-03-03
  • Rust使用lettre實(shí)現(xiàn)郵件發(fā)送功能

    Rust使用lettre實(shí)現(xiàn)郵件發(fā)送功能

    這篇文章主要為大家詳細(xì)介紹了Rust如何使用lettre實(shí)現(xiàn)郵件發(fā)送功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • Rust語(yǔ)言數(shù)據(jù)類型的具體使用

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

    在Rust中,每個(gè)值都有一個(gè)明確的數(shù)據(jù)類型,本文主要介紹了Rust語(yǔ)言數(shù)據(jù)類型的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • rust交叉編譯問(wèn)題及報(bào)錯(cuò)解析

    rust交叉編譯問(wèn)題及報(bào)錯(cuò)解析

    這篇文章主要為大家介紹了rust交叉編譯問(wèn)題及報(bào)錯(cuò)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評(píng)論

蒙自县| 新丰县| 资阳市| 曲沃县| 株洲县| 芮城县| 孙吴县| 靖州| 于都县| 西和县| 兴国县| 获嘉县| 化州市| 汉中市| 白银市| 卢氏县| 兰西县| 乡宁县| 察哈| 宝兴县| 珠海市| 奉新县| 莱芜市| 石狮市| 桦南县| 抚远县| 泾源县| 江门市| 龙江县| 泾川县| 昌乐县| 呼和浩特市| 页游| 金堂县| 余姚市| 克什克腾旗| 通道| 壤塘县| 营口市| 牟定县| 靖宇县|