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

在Rust中編寫自定義Error的詳細代碼

 更新時間:2024年01月26日 09:42:29   作者:歸云十九少  
Result<T, E> 類型可以方便地用于錯誤傳導,Result<T, E>是模板類型,實例化后可以是各種類型,但 Rust 要求傳導的 Result 中的 E 是相同類型的,所以我們需要編寫自己的 Error 類型,本文給大家介紹了在Rust中編寫自定義Error的詳細代碼,需要的朋友可以參考下

前言

之前我們聊過,Result<T, E> 類型可以方便地用于錯誤傳導,Result<T, E>是模板類型,實例化后可以是各種類型,但 Rust 要求傳導的 Result 中的 E 是相同類型的,或者能夠自動轉化為相同類型。比如,下面這段代碼編譯就會報錯。所以我們需要編寫自己的 Error 類型,以同時包含系統(tǒng)錯誤和具體業(yè)務錯誤。

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 標準庫已經(jīng)定義一系列 Error,主要是 io Error。它的定義如下:

pub struct Error {
    repr: Repr,
}

我們可以通過它的關聯(lián)函數(shù) new,from,other,配合 ErrorKind 來生成一個io Error 用于Reuslt。

自定義 Error

我們要定義一個自己的 Error 類型,它既包含系統(tǒng)的 io Error,也包含業(yè)務 Error,定義如下

// 業(yè)務 Error 定義
enum WorkError {
  	WorkErrorFirst,
    WorkErrorSecond,
    WorkErrorThird,
}

// 復合 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");
        }
    }
}

在上述實現(xiàn)中,我們通過手動方式將 std::io::Error 轉化為 MyError。也可以通過實現(xiàn) From trait 來自動實現(xià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 信息。

到此這篇關于在Rust中編寫自定義Error的詳細代碼的文章就介紹到這了,更多相關Rust編寫自定義Error內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

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

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

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

    Rust動態(tài)調用字符串定義的Rhai函數(shù)方式

    Rust中使用Rhai動態(tài)調用字符串定義的函數(shù),通過eval_expression_with_scope實現(xiàn),但參數(shù)傳遞和函數(shù)名處理有局限性,使用FnCall功能更健壯,但更復雜,總結提供了更通用的方法,但需要處理更多錯誤情況
    2025-02-02
  • Rust使用Channel實現(xiàn)跨線程傳遞數(shù)據(jù)

    Rust使用Channel實現(xiàn)跨線程傳遞數(shù)據(jù)

    消息傳遞是一種很流行且能保證安全并發(fā)的技術,Rust也提供了一種基于消息傳遞的并發(fā)方式,在rust里使用標準庫提供的Channel來實現(xiàn),下面我們就來學習一下如何使用Channel實現(xiàn)跨線程傳遞數(shù)據(jù)吧
    2023-12-12
  • Rust中FFI編程知識點整理總結(推薦)

    Rust中FFI編程知識點整理總結(推薦)

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

    rust?創(chuàng)建多線程web?server的詳細過程

    web?server?中主要的兩個協(xié)議是?http?和?tcp,tcp?是底層協(xié)議,http?是構建在?tcp?之上的,本篇文章重點給大家介紹rust?創(chuàng)建多線程web?server的詳細過程,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • rust標準庫std::env環(huán)境相關的常量

    rust標準庫std::env環(huán)境相關的常量

    在本章節(jié)中, 我們探討了Rust處理命令行參數(shù)的常見的兩種方式和處理環(huán)境變量的兩種常見方式, 拋開Rust的語法, 實際上在命令行參數(shù)的處理方式上, 與其它語言大同小異, 可能影響我們習慣的也就只剩下語法,本文介紹rust標準庫std::env的相關知識,感興趣的朋友一起看看吧
    2024-03-03
  • Rust模塊關鍵詞和哈希表詳解

    Rust模塊關鍵詞和哈希表詳解

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

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

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

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

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

    rust交叉編譯問題及報錯解析

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

最新評論

泰州市| 攀枝花市| 新营市| 合水县| 新沂市| 洛阳市| 苍山县| 黔西| 永昌县| 万宁市| 吉安县| 滦南县| 都匀市| 宣城市| 昔阳县| 云林县| 宜章县| 迁西县| 阆中市| 邓州市| 马关县| 绥芬河市| 宁陕县| 金山区| 饶平县| 定西市| 抚顺市| 四会市| 连州市| 开远市| 玛多县| 邢台市| 平定县| 高安市| 蒙阴县| 仙桃市| 蒙自县| 丹棱县| 比如县| 青河县| 开江县|