31.错误处理.rs
生活随笔
收集整理的這篇文章主要介紹了
31.错误处理.rs
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
/*
程序中一般會出現兩種錯誤:可恢復錯誤和不可恢復錯誤
可恢復錯誤:可恢復錯誤的典型案例是文件訪問錯誤,如果訪問一個文件失敗,有可能是因為它正在被占用,是正常的,我們可以通過等待來解決
不可恢復錯誤:由編程中無法解決的邏輯錯誤導致的,例如訪問數組末尾以外的位置
對于可恢復錯誤用 Result<T, E> 類來處理,對于不可恢復錯誤使用 panic! 宏來處理。
enum Result<T, E> {Ok(T),Err(E),
}
在 Rust 標準庫中可能產生異常的函數的返回值都是 Result 類型的*/use std::fs::File;
use std::io;
use std::io::Read;fn main() {//不可恢復錯誤用法://panic!("error occured");let f = File::open("hello.txt");match f {Ok(file) => {println!("File opened successfully.");}Err(err) => {println!("Failed to open the file.");}}//如果想使一個可恢復錯誤按不可恢復錯誤處理,Result 類提供了兩個辦法:unwrap() 和 expect(message: &str) ://兩者的區別在于 expect 能夠向 panic! 宏發送一段指定的錯誤信息。let f1 = File::open("hello.txt").unwrap();let f2 = File::open("hello.txt").expect("Failed to open.");//測試方法1let r = myerro(-10000);if let Ok(v) = r {println!("Ok: f(-1) = {}", v);} else {println!("Err");}//測試方法2println!("{:?}", call_myerro(-101));//測試方法3println!("{:?}", call_myerro2(101));catch_ifreadfile_err();
}//自定義錯誤
fn myerro(i: i32) -> Result<i32, bool> {if i >= 0 {Ok(i)} else {Err(false)}
}//測試-自定義錯誤
fn call_myerro(i: i32) -> Result<i32, bool> {let t = myerro(i);return match t {Ok(i) => Ok(i),Err(b) => Err(b),};
}//call_myerro寫有些冗長,Rust 中可以在 Result 對象后添加 ? 操作符將同類的 Err 直接傳遞出去.
//? 符的實際作用是將 Result 類非異常的值直接取出,如果有異常就將異常 Result 返回出去。所以,?
//符僅用于返回值類型為 Result<T, E> 的函數,其中 E 類型必須和 ? 所處理的 Result 的 E 類型一致
fn call_myerro2(i: i32) -> Result<i32, bool> {let t = myerro(i)?;Ok(t)
}//獲取 Err 類型的函數是 kind().實現try catch
//Rust 似乎沒有像 try 塊一樣可以令任何位置發生的同類異常都直接得到相同的解決的語法,但這樣并不意味
//著 Rust 實現不了:我們完全可以把 try 塊在獨立的函數中實現,將所有的異常都傳遞出去解決fn read_text_from_file(path: &str) -> Result<String, io::Error> {let mut f = File::open(path)?;let mut s = String::new();f.read_to_string(&mut s)?;Ok(s)
}fn catch_ifreadfile_err() {let str_file = read_text_from_file("hello2.txt");match str_file {Ok(s) => println!("{}", s),Err(e) => match e.kind() {io::ErrorKind::NotFound => {println!("No such file");}_ => {println!("Cannot read the file");}},}
}
?
總結
以上是生活随笔為你收集整理的31.错误处理.rs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 30.并发.rs
- 下一篇: 32.生命周期注释.rs