Rust錯誤處理:Result

文章目錄

    • 簡介
    • 錯誤匹配

Rust基礎教程: 初步? 所有權? 結構體和枚舉類? 函數進階? 泛型和特征? 并發和線程通信? cargo包管理? 可空類型Option
Rust進階教程: 用宏實現參數可變的函數? 類函數宏

簡介

Rust中沒有提供類似try…catch之類的分支語句塊,而是提供了Result這種數據類型,用于處理錯誤的返回值。和Option類似,Result的實質也是一種枚舉類型

enum Result<T, E> {Ok(T),Err(E),
}

下面做一個簡單的示例,用Result類型的返回值,來構造一個除法函數,并表示x/0這種問題

// res.rs
fn div_err(x:f32, y:f32) -> Result<f32, String>{if y==0.0{ Err("DIV BY ZERO".to_string()) } else{ Ok(x/y) }
}fn main(){println!("5/3={:?}", div_err(5.0,3.0));println!("5/0={:?}", div_err(5.0,0.0));
}

運行結果如下

>res.exe
5/3=Ok(1.6666666)
5/0=Err("DIV BY ZERO")

Rust有一個值得注意的性質,即未處理的Result,會在編譯時提出警告,比如把main函數改成下面的形式,那么編譯時會給出Result必須被使用的警告。

fn main(){div_err(5.0,3.0);
}

錯誤匹配

考慮到Result的本質是枚舉類型,所以其常規的處理方式,也就是使用match匹配,相應地,Result也支持un_wrap方法,當Result的返回值是Err時輸出直接報錯。但另一方面,Result支持多種錯誤的設置,所以從報錯的角度來說,功能顯然是更全面的。

仍以除法為例,盡管除數為0時一定要報錯,但形如 x / 0 x/0 x/0 0 / 0 0/0 0/0顯然是兩種不同的錯誤。如果為實數添加一個無窮大,那么實數域就可以映射到一個圓形上面,從而 x / 0 x/0 x/0就可以等于 ∞ \infty ,但 0 / 0 0/0 0/0仍然是錯的。

下面就針對這兩種不同的情況,為其設置錯誤。

fn div_err(x:f32, y:f32) -> Result<f32, String>{if y==0.0{if x==0.0{ Err("DIV ERROR".to_string())}else { Err("INF ERROR".to_string()) }} else{Ok(x/y)}
}fn div_print(x:f32, y:f32){match div_err(x, y){Ok(res) => println!("{}/{}={}", y, x, res),Err(res) => println!("{}", res)}
}fn main(){div_print(5.0, 3.0);div_print(5.0, 0.0);div_print(0.0, 0.0);
}

運行結果如下

>res.exe
3/5=1.6666666
INF ERROR
DIV ERROR

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/161992.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/161992.shtml
英文地址,請注明出處:http://en.pswp.cn/news/161992.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

qt雙擊treeview節點之后,完成編輯,獲取完成編輯得信號

Qt 中&#xff0c;要獲取 QTreeView 節點完成編輯的信號&#xff0c;您可以使用 QTreeView 的 doubleClicked 信號以及重寫相應的編輯觸發函數。通常情況下&#xff0c;完成編輯后會觸發 closeEditor 信號。 以下是一個示例代碼&#xff0c;演示了如何實現這個功能&#xff1a…

【亞太杯思路助攻】2023年第十三屆APMCM亞太地區大學生數學建模競賽——(文末領取方式)

2023年第十三屆APMCM亞太地區大學生數學建模競賽——正式開賽&#xff01;&#xff01;&#xff01; 賽題已由高分雅思學姐翻譯完成&#xff0c;我們的O獎學長也在第一時間分析了賽題&#xff0c;幫助大家最快時間&#xff0c;選擇最適合是自己的賽題。 B題 C題 祝各位小伙伴都…

[Android]使用Retrofit進行網絡請求

以下是使用 Retrofit 發送 POST 請求獲取分頁城市列表的 Kotlin 代碼示例 1.在你的 build.gradle 文件中添加 Retrofit 和 Gson 的依賴 dependencies {......implementation("com.squareup.retrofit2:retrofit:2.9.0")implementation("com.squareup.retrofit2…

排序算法--歸并排序

實現邏輯 ① 將序列每相鄰兩個數字進行歸并操作&#xff0c;形成floor(n/2)個序列&#xff0c;排序后每個序列包含兩個元素 ② 將上述序列再次歸并&#xff0c;形成floor(n/4)個序列&#xff0c;每個序列包含四個元素 ③ 重復步驟②&#xff0c;直到所有元素排序完畢 void pri…

C#結合JavaScript實現上傳視頻到騰訊云點播平臺

目錄 需求 關鍵代碼 界面元素布局 C# 實現服務端的簽名類 上傳視頻的JS實現 視頻演示 小結 需求 在云培訓系統里&#xff0c;制作視頻課件是我們的主要工作之一&#xff0c;制作完成后如果將這些素材存儲到服務器并進行分發播放&#xff0c;是擺在我們面前的一個問題。…

JVM垃圾回收相關算法

目錄 一、前言 二、標記階段&#xff1a;引用計數算法 三、標記階段&#xff1a;可達性分析算法 &#xff08;一&#xff09;基本思路 &#xff08;二&#xff09;GC Roots對象 四、對象的finalization機制 五、MAT與JProfiler的GC Roots溯源 六、清除階段&#xff1a;…

基于PCA算法的點云平面擬合

平面擬合 1、平面擬合2、參考文獻3、相關代碼 1、平面擬合 PCA 是一種數學變換的方法&#xff0c;利用降維的思想在變換中保持變量的總方差不變&#xff0c;將給定的一組變量線性變換為另一組不相關的變量&#xff0c;并且使變換后的第一變量的方差最大&#xff0c;即第一主成分…

OpenCV將兩張圖片拼接成一張圖片

OpenCV將兩張圖片拼接成一張圖片 示例代碼1示例代碼2 可以用opencv或者numpy的拼接函數&#xff0c;直接將兩張圖拼接到一起&#xff0c;很簡單方便&#xff0c;參考代碼2&#xff0c;推薦此方式。新建圖片&#xff0c;將兩張圖片的像素值填充到新圖片對應位置上即可&#xff0…

leetcode 32最長有效括號 34在排序數組中查找元素的第一個和最后一個位置

32. 最長有效括號 給你一個只包含 ( 和 ) 的字符串&#xff0c;找出最長有效&#xff08;格式正確且連續&#xff09;括號子串的長度。 示例 1&#xff1a; 輸入&#xff1a;s "(()" 輸出&#xff1a;2 解釋&#xff1a;最長有效括號子串是 "()" 示例 2&a…

python 二分查找函數應用——bisect_left(nums,target),bisect_right(nums,target)

bisect_left(nums,target),bisect_right(nums,target)是python內置的函數&#xff0c;可以便捷的幫我們完成一些有序序列的查找工作&#xff0c;現在將用三個樣例進行講解演示 前提注意事項&#xff1a; 導入函數模塊 待處理序列必須有序&#xff01;&#xff01;&#xff0…

淺談WPF之各種Template

前幾天寫了一篇文章【淺談WPF之控件模板和數據模板】&#xff0c;有粉絲反饋說這兩種模板容易弄混&#xff0c;不知道什么時候該用控件模塊&#xff0c;什么時候該用數據模板&#xff0c;以及template和itemtemplate之間的關系等&#xff0c;今天專門寫一篇文章&#xff0c;簡述…

26 - 原型模式與享元模式:提升系統性能的利器

原型模式和享元模式&#xff0c;前者是在創建多個實例時&#xff0c;對創建過程的性能進行調優&#xff1b;后者是用減少創建實例的方式&#xff0c;來調優系統性能。這么看&#xff0c;你會不會覺得兩個模式有點相互矛盾呢&#xff1f; 其實不然&#xff0c;它們的使用是分場…

TC397 EB MCAL開發從0開始系列 之 [15.1] Fee配置 - 雙扇區demo

一、Fee配置1、配置目標2、目標依賴2.1 硬件使用2.2 軟件使用2.3 新增模塊3、EB配置3.1 配置講解3.2 模塊配置3.2.1 MCU配置3.2.2 PORT配置3.2.3 Fls_17_Dmu配置3.2.4 Fee配置3.2.5 Irq配置3.2.6 ResourceM配置4、ADS代碼編寫及調試4.1 工程編譯4.2 測試結果4.3 測例源碼->

2023年學習Go語言是否值得?探索Go語言的魅力

關注公眾號【愛發白日夢的后端】分享技術干貨、讀書筆記、開源項目、實戰經驗、高效開發工具等&#xff0c;您的關注將是我的更新動力&#xff01; 作為一門流行且不斷增長的編程語言&#xff0c;Go語言在2023年是否值得學習呢&#xff1f;讓我們來看看學習Go語言的好處以及為何…

Java使用Maven打包jar包的全部方式

1. spring-boot-maven-plugin插件&#xff08;在springboot項目中使用&#xff09; <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals>…

1410.HTML 實體解析器

??題目來源&#xff1a; leetcode題目&#xff0c;網址&#xff1a;1410. HTML 實體解析器 - 力扣&#xff08;LeetCode&#xff09; 解題思路&#xff1a; 使用map存放特殊字符串及其應被替換為的字符串。然后遍歷字符串替換 map 中的字符串即可。 解題代碼&#xff1a; …

ubuntu 手動清理內存cache

/proc是一個虛擬文件系統&#xff0c;我們可以通過對它的讀寫操作來做為與kernel實體間進行通信的一種手段。也就是說可以通過修改/proc中的文件&#xff0c;來對當前kernel的行為做出調整。 那么我們可以通過調整/proc/sys/vm/drop_caches來釋放內存。操作如下&#xff1a; …

富士康轉移產線和中國手機海外設廠,中國手機出口減少超5億部

富士康和蘋果轉移生產線對中國手機制造造成了巨大的影響&#xff0c;除此之外&#xff0c;中國手機企業紛紛在海外設廠也在減少中國手機的出口&#xff0c;2022年中國的手機出口較高峰期減少了5.2億部。 手機是中國的大宗出口商品&#xff0c;不過公開的數據顯示2022年中國的手…