關於程序語言中的Error,一般可以分爲錯誤和異常。
錯誤和異常的區別:
1. 錯誤,一般是指程序員有能力解決的問題;
2. 異常,是指程序員無法解決的問題或者是說特定的代碼邏輯錯誤;
在Rust中,分爲 不可恢復的錯誤 (異常) 和 可恢復的錯誤(錯誤)。
如何產生不可恢復的錯誤:
示例:
// 1. 使用 panic! 宏 fn main() { panic!("error"); println!("unreachable"); } // 2. 斷言(宏) // 常用的 assert! , assert_eq! fn main() { // assert!(1 == 2); assert_eq(1, 2); } // 3. 未實現的代碼 // 聲明一個臨時未聲明函數體的函數 fn add(_a: u32, _b: u32) -> u32 { unimplemented!() } fn main() { let _val = add(0, 1); } // 4. 不可達的代碼 fn main() { unreachable!() }
如何產生可恢復的錯誤:
示例
// 1. 利用Rust中的 Result 枚舉 fn main() { // 成功後的響應結果 let success: Result<u32, &'static str> = Result::Ok(0); println!("{:?}", success); // 失敗後的返回 let fail: Result<u32, &'static str> = Result::Err("error"); println!("{:?}", fail); } // or fn main() { let res = std::fs::read("/a/b"); match res { Ok(val) => println!("{:?}", std::str::from_utf8(&val).unwrap()), Err(err) => println!("{:?}", err), } }
如何自定義錯誤:
示例
#[derive(Debug)] // 自定義一個枚舉類 pub enum Error { IO(std::io::ErrorKind), } // 將std::io::ErrorKind轉換爲 enum Error 中定義的錯誤類型 // 爲 enum Error 實現 From trait impl From<std::io::Error> for Error { // From trait裏面有一個from函數(完成轉換) fn from(error: std::io::Error) -> Self { // 返回值爲我們自定義的Error Error::IO(error.kind()) } } fn read_file() -> Result<(), Error> { // 問號表達式用於傳遞錯誤 let stream = std::fs::read("/.zshrc")?; let data = std::str::from_utf8(&stream).unwrap(); println!("{:?}", data); Ok(()) } fn main() { let v = read_file(); println!("{:?}", v); }