📜  Rust – 可恢复的错误

📅  最后修改于: 2022-05-13 01:55:44.518000             🧑  作者: Mango

Rust – 可恢复的错误

错误基本上是一种意外的行为或事件,它可能导致程序产生不需要的输出或突然终止。错误是在他们的程序中没有人想要的东西。可恢复错误是那些不会导致程序突然终止的错误。示例 - 当我们尝试获取不存在的文件或我们没有打开它的权限时。

大多数语言不区分这两个错误并使用 Exception 类来克服它们,而 Rust 使用数据类型 Result 来处理可恢复的错误和恐慌!宏以在出现不可恢复的错误时停止程序的执行。 Result 是一个枚举数据类型,它有两个变体 OK 和 Err,其定义如下:-

enum Result {
   Ok(T),
   Err(E),
}

T 和 E 是泛型类型参数,其中 T 表示将在 Ok 变体中的成功案例中返回的值的类型,而 E 表示将在 Err 变体中的失败案例中返回的错误类型。

Rust
use std::fs::File;
  
fn main() {
   let f = File::open("gfg.txt");
    println!("{:?}",f);
}


Rust
use std::fs::File;
  
fn main() {
  
  // file doesn't exist
  let f = File::open("gfg.txt");
  
  match f {
     Ok(file)=> {
        println!("file found {:?}",file);
     },
     Err(_error)=> {
             
       // replace it with whatever you want to do if file is not found
        println!("file not found \n");   
     }
      }
  }


Rust
fn main(){
  
  let result = eligible(13);
  
  match result {
     Ok(age)=>{
        println!("Person eligible to vote with age={}",age);
     },
  
     Err(msg)=>{
        println!("{}",msg);
     }
  }
}
  
fn eligible(age:i32)->Result {
  
  if age>=18 {
     return Ok(age);
  
  } else {
     return Err("Not Eligible..Wait for some years".to_string());
  }
}


Rust
use std::fs::File;
fn main() {
  
   let f = File::open("gfg.txt").unwrap();
  
}


Rust
use std::fs::File;
  
fn main() {
   let f = File::open("hello.txt").expect("Failed to open gfg.txt");
}


输出



Err(Os { code: 2, kind: NotFound, message: "No such file or directory" })

由于文件 gfg.txt 不存在,所以文件返回了 Err 实例。如果找到了文件 gfg.txt,则将返回该文件的一个实例。

如果像上述情况一样没有找到文件,那么最好让用户检查文件名、文件位置或再次提供文件规格或任何情况需要。

use std::fs::File;
  
fn main() {
  
  // file doesn't exist
  let f = File::open("gfg.txt");
  
  match f {
     Ok(file)=> {
        println!("file found {:?}",file);
     },
     Err(_error)=> {
             
       // replace it with whatever you want to do if file is not found
        println!("file not found \n");   
     }
      }
  }

输出

file not found

在上面的程序中,它基本上匹配了结果的返回类型,并相应地执行了任务。

让我们根据业务逻辑创建我们自己的错误。假设我们想要在 18 岁以下的人尝试申请选民 ID 时产生错误。

fn main(){
  
  let result = eligible(13);
  
  match result {
     Ok(age)=>{
        println!("Person eligible to vote with age={}",age);
     },
  
     Err(msg)=>{
        println!("{}",msg);
     }
  }
}
  
fn eligible(age:i32)->Result {
  
  if age>=18 {
     return Ok(age);
  
  } else {
     return Err("Not Eligible..Wait for some years".to_string());
  }
}

输出

Not Eligible..Wait for some years

如果我们想在遇到可恢复的错误后中止程序,那么我们可以使用 panic!宏并为了简化过程 Rust 提供了两个方法 unwrap() 和 expect()。

  • 解包()

use std::fs::File;
fn main() {
  
   let f = File::open("gfg.txt").unwrap();
  
}

输出

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value:
Os { code: 2, kind: NotFound, message: "No such file or directory" }', main.rs:17:14

unwrap() 调用恐慌!宏在文件未找到的情况下,如果找到文件,则返回文件处理程序实例。虽然 unwrap() 使程序更短,但是当我们的程序中有太多的 unwrap() 方法时,那么对于将哪个 unwrap() 方法称为 panic!宏。所以我们需要一些可以产生定制消息的东西。在这种情况下,expect() 方法就派上用场了。

  • 预计()

use std::fs::File;
  
fn main() {
   let f = File::open("hello.txt").expect("Failed to open gfg.txt");
}

输出:

thread 'main' panicked at 'Failed to open gfg.txt:
Os { code: 2, kind: NotFound, message: "No such file or directory" }', main.rs:17:14

我们传递了我们的信息来恐慌!宏通过expect参数。