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);
}

 

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