Rust中 不可恢復的錯誤 和 可恢復的錯誤 - 學習隨筆

關於程序語言中的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);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章