里rust怎么找蓝图_Rust错误处理
生活随笔
收集整理的這篇文章主要介紹了
里rust怎么找蓝图_Rust错误处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
錯誤處理是程序開發中必不可少的一個環節,在Rust中,錯誤分成兩個類別:可恢復錯誤和不可恢復錯誤。
可恢復錯誤:比如說未找到文件,Rust中用Result<T,E>來實現
不可恢復錯誤:比如數組訪問越界,Rust中用panic!實現
1.panic!
這個有感嘆號,很顯然是一個宏,我們來使用一下子。
fn main() {panic!("panic here!"); }報錯信息:
thread 'main' panicked at 'panic here!', srcmain.rs:2:5 stack backtrace:0: backtrace::backtrace::trace_unsynchronized ... 這底下還有很多調用堆棧的信息哈,我們現在不去關心它使用RUST_BACKTRACE=1命令來運行程序也可以調出調用堆棧信息。
2.Result
Result其實是一個枚舉類型,它的原型如下:
enum Result<T, E> {Ok(T),Err(E), }我們通過打開文件來舉例說明:
use std::fs::File;fn main() {let f = File::open("Rust.txt");//枚舉當然需要來match一下let f = match f {Ok(file) => file,Err(error) => panic!("error: {}", error),}; }我們的當前目錄里并沒有這個文件,預期是會出錯的。
報錯信息:
thread 'main' panicked at 'error: 系統找不到指定的文件。 (os error 2)', srcmain.rs:8:23 stack backtrace:0: backtrace::backtrace::trace_unsynchronizedemmm,我這里居然還是中文!。。。我以為是No such a file or directory.
3.簡寫形式
我們可以通過unwrap或者expect函數來簡寫程序。
use std::fs::File;fn main() { // let f = File::open("Rust.txt"); // //枚舉當然需要來match一下 // let f = match f { // Ok(file) => file, // Err(error) => panic!("error: {}", error), // };let f = File::open("Rust.txt").unwrap(); }報錯信息:
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: "系統找不到指定的文件。" }', srclibcoreresult.rs:1165:5 stack backtrace:0: backtrace::backtrace::trace_unsynchronized use std::fs::File;fn main() {let f = File::open("Rust.txt").expect("failed to open Rust.txt"); }報錯信息:
thread 'main' panicked at 'failed to open Rust.txt: Os { code: 2, kind: NotFound, message: "系統找不到指定的文件。" }', srclibcoreresult.rs:1165:5 stack backtrace:0: backtrace::backtrace::trace_unsynchronized4.傳播錯誤
當我們調用一個函數的時候,函數內部可能出錯,而調用方需要捕捉錯誤信息,因此可以將錯誤傳出來,這個過程就是傳播錯誤。
還是以讀取文件內容來舉例:
use std::fs::File; use std::io::Read; use std::io;fn main() {let res = read_file();match res {Ok(str) => println!("str: {}", str),Err(error) => println!("error: {}", error)}; }fn read_file() -> Result<String, io::Error> {let f = File::open("Rust.txt");let mut f = match f {Ok(file) => file,Err(error) => return Err(error)};let mut str = String::new();match f.read_to_string(&mut str) {Ok(_) => Ok(str),Err(error) => Err(error)} }我們創建了一個Rust.txt文件,運行結果如下:
str: Rust編程之路我們把文件刪除:
運行結果:
error: 系統找不到指定的文件。 (os error 2)也是把錯誤信息打印出來了。
5.小問號,你是否有很多朋友?
我們可以通過“?”,來做到傳播錯誤的簡寫:
use std::fs::File; use std::io::Read; use std::io;fn main() {let res = read_file();match res {Ok(str) => println!("str: {}", str),Err(error) => println!("error: {}", error)}; }fn read_file() -> Result<String, io::Error> {let mut f = File::open("Rust.txt")?;let mut str = String::new();f.read_to_string(&mut str)?;Ok(str) }還可以再簡單一點:
fn read_file() -> Result<String, io::Error> {let mut str = String::new();File::open("Rust.txt")?.read_to_string(&mut str)?;Ok(str) }就很棒!
6.panic!和Result如何選擇?
在測試過程中,我們可以使用panic!,這樣調試起來比較方便。
但是在正式發布的代碼中,為了程序的健壯性和容錯率,最好不要使用panic!
個人觀點哈~
7.panic的實現機制
在Rust中,panic的實現方式有兩種:unwind和abort
unwind 方式在發生panic 的時候,會一層一層地退出函數調用枝,在此過程中,當前棧內的局部變量還可以正常析構。 abort 方式在發生panic 的時候,會直接退出整個程序。一般來說,默認情況下,編譯器都是使用的unwind模式。
如何用戶自己制定:
rustc -C panic=unwind test.rs rustc -C panic=abort test.rs歡迎關注公眾號:Rust編程之路
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的里rust怎么找蓝图_Rust错误处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 合流超几何函数_【初中数学大招流】从平面
- 下一篇: python测试之道pdf百度云_Pyt