Rust – 可恢复的错误
错误基本上是一种意外的行为或事件,它可能导致程序产生不需要的输出或突然终止。错误是在他们的程序中没有人想要的东西。可恢复错误是那些不会导致程序突然终止的错误。示例 - 当我们尝试获取不存在的文件或我们没有打开它的权限时。
大多数语言不区分这两个错误并使用 Exception 类来克服它们,而 Rust 使用数据类型 Result
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参数。