错误处理之:Result、Option以及panic!宏
Rust中的错误可以分为两种
- Recoverable error:有返回类型
返回Result类型
返回Option类型
- Unrecoverable type:没有返回类型,直接崩溃
panic macro 将终止当前线程
-
Result 是一个枚举类型,有两个变体:Ok和Err。它通常用于表示函数的执行结果,其中Ok表示成功的结果,Err表示出现了错误
pub enum Result<T, E> { Ok(T), Err(E) }
-
Option也是一个枚举类型,有两个变体:Some和None。它通常用于表示一个可能为空的值。
pub enum Option<T> { None, Some(T), }
-
panic! 当程序遇到无法继续执行的错误时,可以用
panic!
宏来引发恐慌。恐慌会导致程序立即终止,并显示一条错误信息。
fn divide(a: i32, b: i32) -> Result<f64, String> {
if b == 0 {
return Err(String::from("cannot be zero"));
}
let a = a as f64;
let b = b as f64;
Ok(a / b)
}
fn find_element(array: &[i32], target: i32) -> Option<usize> {
for (index, element) in array.iter().enumerate(){
if (*element) == target {
return Some(index)
}
}
None
}
fn main(){
// result
match divide(1, 2) {
Ok(number) => println!("{number}"),
Err(err) => println!("{err}"),
}
match divide(1, 0) {
Ok(number) => println!("{number}"),
Err(err) => println!("{err}"),
}
// Option
let arr = [1, 2, 3, 4, 5];
match find_element(&arr, 3) {
Some(index) => println!("the number 3 is located at {index}"),
None => println!("cannot find the number 3"),
}
// panic!
}
错误处理之:unwrap()与?
unwrap()方法并不安全
unwrap()是 Result 和 Option 类型提供的方法之一。它是一个简便的方法,用于获取 Ok 或 Some 的值,如果是Err 或 None 则会引发 panic
? 运算符 用于简化 Result 或 Option 类型的错误传播。它只能用于返回 Result 或 Option 的函数中,并且在函数内部可以像使用 unwrap() 一样访问 Ok 或 Some 的值,但是如果是 Err 或者 None 则会提前返回。
use std::num::ParseIntError;
fn find_first_even(numbers: Vec<i32>) -> Option<i32> {
let first_even = numbers.iter().find(|&num| num % 2 == 0)?;
print!("Option");
Some(*first_even)
}
// 传递错误
fn parse_numbers(input: &str) -> Result<i32, ParseIntError> {
let val = input.parse::<i32>()?;
Ok(val)
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let result_ok: Result<i32, &str> = Ok(32);
let value = result_ok.unwrap();
println!("{}", value);
let result_ok: Result<i32, &str> = Ok(32);
let value = result_ok?;
println!("{}", value);
let numbers = vec![1, 3, 4, 5];
match find_first_even(numbers) {
Some(number) => println!("first even {}", number),
None => println!("no such number"),
}
match parse_numbers("d") {
Ok(i) => println!("parsed {}", i),
Err(err) => println!("failed to parse: {}", err),
}
Ok(())
}
自定义一个Error类型
1.定义错误类型结构体:创建一个结构体来表示你的错误类型,通常包含一些字段来描述错误的详细信息。
2.实现 std::fmt::Display
trait: 实现这个trait以定义如何展示错误信息。这是为了使错误能够以人类可读的方式打印出来。
3.实现 std:error::Error
trait: 实现这个trait以满足Rust的错误处理机制的要求。
#[derive(Debug)]
struct MyError {
detail: String,
}
impl std::fmt::Display for MyError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "Customer Error: {}", self.detail)
}
}
impl std::error::Error for MyError {
fn description(&self) -> &str {
&self.detail
}
// &String => &str
}
fn func() -> Result<(), MyError>{
Err(MyError{
detail: "Custom Error".to_owned(),
})
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
match func() {
Ok(_) => println!("function ok"),
Err(err) => println!("Error: {}", err),
}
func()?;
println!("oo");
Ok(())
}
标签:Ok,入门,Err,简易,let,Result,println,Rust,Option
From: https://www.cnblogs.com/moguw/p/18105922