首页 > 其他分享 >Rust简易入门(四)

Rust简易入门(四)

时间:2024-03-30 20:04:16浏览次数:25  
标签:Ok 入门 Err 简易 let Result println Rust Option

错误处理之:Result、Option以及panic!宏

Rust中的错误可以分为两种

  1. Recoverable error:有返回类型

返回Result类型

返回Option类型

  1. 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/rust-base-4

相关文章

  • Rust简易入门(五)
    Borring&&BorrowChecker&&LifetimeBorrowing(引用的函数式声明)一个玩意的两种描述引用(reference):引用是一种变量的别名,通过&符号来创建(非所有权)引用可以是不可变的(&T)或可变的(&mutT)引用允许在不传递所有权的情况下访问数据,他们是安全且低开销的借用(Borrowing):......
  • Rust简易入门(四)
    错误处理之:Result、Option以及panic!宏Rust中的错误可以分为两种Recoverableerror:有返回类型返回Result类型返回Option类型Unrecoverabletype:没有返回类型,直接崩溃panicmacro将终止当前线程Result是一个枚举类型,有两个变体:Ok和Err。它通常用于表示函数的执行结......
  • Rust简易入门(五)
    Borring&&BorrowChecker&&LifetimeBorrowing(引用的函数式声明)一个玩意的两种描述引用(reference):引用是一种变量的别名,通过&符号来创建(非所有权)引用可以是不可变的(&T)或可变的(&mutT)引用允许在不传递所有权的情况下访问数据,他们是安全且低开销的借用(Borrowing):......
  • (七)Rust 通用的编程概念
    变量与可变性在Rust语言中,声明变量是使用let关键字,而且变量默认是不可改变的,一旦值被绑定在一个名称上,就不能给这个变量重新赋值,如果重新赋值的话,就会在编译的时候报错。这是Rust提供给我们的众多优势之一,让我们可以充分利用Rust提供的安全性和简单并发性来编写代码......
  • (八)Rust 函数和注释
    函数在Rust里,声明函数使用fn关键字,按照惯例,针对函数和变量名,Rust使用snakecase命名规范:所有的字母都是小写,单词之间使用下划线分开,例如:函数的参数定义函数时里边定义的参数,叫形参(parameters)调用函数时传递的具体参数,叫实参(arguments)在函数签名里,必须声明每个参数的类......
  • PS从入门到精通视频各类教程整理全集,包含素材、作业等(3)
    PS从入门到精通视频各类教程整理全集,包含素材、作业等最新PS以及插件合集,可在我以往文章中找到由于阿里云盘有分享次受限制和文件大小限制,今天先分享到这里,后续持续更新 中级教程https://www.alipan.com/s/unii5YxtM8B提取码:4ji2点击链接保存,或者复制本段内容,打开「阿......
  • PS从入门到精通视频各类教程整理全集,包含素材、作业等(3)复发
    PS从入门到精通视频各类教程整理全集,包含素材、作业等最新PS以及插件合集,可在我以往文章中找到由于阿里云盘有分享次受限制和文件大小限制,今天先分享到这里,后续持续更新 中级教程https://www.alipan.com/s/unii5YxtM8B提取码:4ji2点击链接保存,或者复制本段内容,打开「阿......
  • C++入门(一)
    目录命名空间:为什么要提出命名空间?命名空间的定义:命名空间的使用:加命名空间名称及作用域限定符:使用using将命名空间中某个成员引入:使用usingnamespace命名空间名称引用:C++输入&输出:库的导入:使用说明:输入和输出:输入流:输出流:缺省参数:缺省参数的概念:缺省参数的......
  • 中间件 ZK分布式专题与Dubbo微服务入门 6-3 同步异步创建zk节点
    0课程地址https://coding.imooc.com/lesson/201.html#mid=12719 1重点关注1.1本节内容javaapi客户端新增临时节点和永久节点 1.2javaapi新增节点同步调用/***同步或者异步创建节点,都不支持子节点的递归......
  • Rust简易入门(二)
    Rust内存管理模型"Stoptheworld'"是与垃圾回收(GarbageCollection)相关的术语,它指的是在进行垃圾回收时系统暂停程序的运行。这个术语主要用于描述一种全局性的暂停,即所有应用线程都被停止,以便垃圾回收器能够安全地进行工作。这种全局性的停止会导致一些潜在的问题,特别是对于......