在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();
}

系統(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動態(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ù)
消息傳遞是一種很流行且能保證安全并發(fā)的技術,Rust也提供了一種基于消息傳遞的并發(fā)方式,在rust里使用標準庫提供的Channel來實現(xiàn),下面我們就來學習一下如何使用Channel實現(xiàn)跨線程傳遞數(shù)據(jù)吧2023-12-12
rust?創(chuàng)建多線程web?server的詳細過程
web?server?中主要的兩個協(xié)議是?http?和?tcp,tcp?是底層協(xié)議,http?是構建在?tcp?之上的,本篇文章重點給大家介紹rust?創(chuàng)建多線程web?server的詳細過程,感興趣的朋友跟隨小編一起看看吧2023-11-11
Rust使用lettre實現(xiàn)郵件發(fā)送功能
這篇文章主要為大家詳細介紹了Rust如何使用lettre實現(xiàn)郵件發(fā)送功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-11-11

