Rust- 错误处理

这篇具有很好参考价值的文章主要介绍了Rust- 错误处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Rust approaches error handling with the aim of being explicit about possible error conditions. It separates the concerns of “normal” return values and “error” return values by using a specific set of types for each concern. Rust’s primary tools for expressing these concepts are the Result and Option types, along with the unwrap method.

  1. The Result type: This is an enum that represents either successful (Ok) or unsuccessful (Err) computation. Functions that can fail generally return a Result variant.

    Here’s a simple example:

    fn divide(numerator: f64, denominator: f64) -> Result<f64, &str> {
        if denominator == 0.0 {
            Err("Cannot divide by zero")
        } else {
            Ok(numerator / denominator)
        }
    }
    

    In this case, if you try to divide by zero, the function will return an error wrapped in the Err variant. Otherwise, it will return the division result wrapped in the Ok variant.

  2. The Option type: This is another enum that represents a value that could be something (Some) or nothing (None). It’s often used when you have a situation where a value could be absent or present.

    For example:

    fn find_word_starting_with<'a, 'b>(sentence: &'a str, initial: &'b str) -> Option<&'a str> {
        for word in sentence.split_whitespace() {
            if word.starts_with(initial) {
                return Some(word);
            }
        }
        None
    }
    

    This function tries to find a word starting with a specific string in a sentence. If it finds such a word, it returns Some(word), otherwise, it returns None.

  3. The unwrap method: Both Option and Result types have an unwrap method, which is used to get the value out. If the instance of Option is a Some variant, unwrap will return the value inside the Some. If the instance is a None, unwrap will panic.

    Similarly, for Result, if the instance is an Ok, unwrap will return the value inside the Ok. If the instance is an Err, unwrap will panic.

    let maybe_number: Option<i32> = Some(42);
    println!("{}", maybe_number.unwrap()); // Prints 42
    
    let definitely_not_a_number: Option<i32> = None;
    println!("{}", definitely_not_a_number.unwrap()); // This will panic
    

    It’s generally advised to avoid using unwrap in most situations, as it can lead to your program crashing. Instead, you should handle errors appropriately using pattern matching or methods like unwrap_or, unwrap_or_else, expect, etc., which allow you to provide alternative values or actions in case of an error.

  4. The ? operator: This is a convenient way to propagate errors upwards in the call stack. When you use ? on a Result value, it does pretty much the same as a match expression would do: if the value is Ok, it unwraps it; if it’s Err, it returns it from the current function. This allows for more concise error handling.

fn main() {
    match foo() {
        Ok(_) => println!("Success"),
        Err(e) => println!("Error: {}", e),
    }
}

fn foo() -> Result<(), &'static str> {
    bar()?;
    Ok(())
}

fn bar() -> Result<(), &'static str> {
    Err("Some error")
}

In the foo function, bar()? will return the error from bar, thus ending the foo function early.

These are the basic building blocks of error handling in Rust. Rust also provides advanced features like creating your own error types, using the From trait for flexible error conversions, etc., but those are more advanced topics.文章来源地址https://www.toymoban.com/news/detail-622684.html

use std::fs::File;

fn main() {
    panic!("出错了");
    println!("Hello Rust");

    // panic 程序立即退出,退出的时候调用者抛出退出原因。

    // 数组越界
    let v = vec!["Rust", "Programming", "Language"];
    println!("{}", v[5]); // thread 'main' panicked at 'index out of bounds: the len is 3 but the index is 5'

    // 打开文件出错
    let f = File::open("abc.txt");
    println!("{:?}", f); // Err(Os { code: 2, kind: NotFound, message: "系统找不到指定的文件。" })

    // unwrap expect
    let result = is_even(6).unwrap();
    println!("结果{}", result);

    let result = is_even(11).unwrap();
    println!("结果{}", result);

    // unwrap()是Result<T, E>的方法,实例上调用此方法时,如果是Ok,就返回Ok中的对象
    // 如果是Err枚举,在运行时会panic

    // expect()接收msg::&str作为参数,可以自定义报错信息。
}

fn is_even(no: i32) -> Result<bool, String> {
    return if no % 2 == 0 {
        Ok(true)
    } else {
        Err("输入的值不是偶数".to_string())
    };
}

到了这里,关于Rust- 错误处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 30天拿下Rust之错误处理

    概述         在软件开发领域,对错误的妥善处理是保证程序稳定性和健壮性的重要环节。Rust作为一种系统级编程语言,以其对内存安全和所有权的独特设计而著称,其错误处理机制同样体现了Rust的严谨与实用。在Rust中,错误处理通常分为两大类:不可恢复的错误和可

    2024年03月21日
    浏览(66)
  • Rust Web 全栈开发之 Web Service 中的错误处理

    数据库 数据库错误 串行化 serde 错误 I/O 操作 I/O 错误 Actix-Web 库 Actix 错误 用户非法输入 用户非法输入错误 编程语言常用的两种错误处理方式: 异常 返回值( Rust 使用这种) Rust 希望开发者显式的处理错误,因此,可能出错的函数返回Result 枚举类型,其定义如下: 例子 在

    2024年02月07日
    浏览(40)
  • Rust之构建命令行程序(三):重构改进模块化和错误处理

    Windows 10 Rust 1.74.1   VS Code 1.85.1 这次创建了新的工程minigrep. 为了改进我们的程序,我们将修复与程序结构及其处理潜在错误的方式有关的四个问题。首先,我们的 main 函数现在执行两项任务:解析参数和读取文件。随着我们程序的增长, main 处理的独立任务的数量也会增加。随

    2024年01月18日
    浏览(48)
  • Rust腐蚀申述教程Rust被办申述处理

    玩Rust很难避免被办,但有些被办是理所当。例如:开G、开宏或者其他作弊行为影响了游戏平衡,本指南主要针对绿色玩家被误封的情况。 一、不同类型的封禁 首先要了解不同的封禁类型,并不是所有的封禁都是公平公正的,特别是国人在外服或者社区服游戏时经常被办出服

    2024年02月06日
    浏览(35)
  • Rust处理JSON

    基本操作 Cargo.toml: main.rs: 输出为: 嵌套结构体 warp [1] 返回不同的结构(一般用枚举来解决) 参考资料 [1] warp: https://github.com/seanmonstar/warp 本文由 mdnice 多平台发布

    2024年02月11日
    浏览(56)
  • rust版本更新错误记录:Os { code: 5, kind: PermissionDenied }

    使用 rustup update 更新 rust 版本时遇到错误: info: cleaning up downloads tmp directories thread ‘main’ panicked at ‘Unable to clean up C:UsersGrapeX.rustuptmp: Os { code: 5, kind: PermissionDenied, message: “拒绝访问。” }’, srcutilsutils.rs:650:13 stack backtrace: note: Some details are omitted, run with RUST_BACKTRACE=full

    2024年02月16日
    浏览(53)
  • RUST Rover 条件编译 异常处理

    会报异常 error: failed to parse manifest at C:UserstopmaRustroverProjectsuntitled2Cargo.toml 网上说明 这样处理 https://course.rs/cargo/reference/features/intro.html RUST 圣经里描述

    2024年04月09日
    浏览(35)
  • Rust中的高吞吐量流处理

    本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序。 最后,作者介绍了如何通过测量空闲和阻塞时间来优化流处理程序的性能,并将这些内容同步至Twitter和blog。 此外,作

    2024年02月14日
    浏览(48)
  • Rust中的字符串处理及相关方法详解

    在Rust中,字符串是一种非常重要的数据类型,而 String 类型则提供了对动态可变字符串的支持。本文将介绍一些常见的字符串处理方法以及相关示例代码。 在Rust中,有多种方式创建字符串,以下是一些常见的例子: push_str()方法 push_str() 方法用于将一个字符串切片附加到 S

    2024年02月19日
    浏览(36)
  • 【Rust】——通过Deref trait将智能指针当作常规引用处理

    💻博主现有专栏:                 C51单片机(STC89C516),c语言,c++,离散数学,算法设计与分析,数据结构,Python,Java基础,MySQL,linux,基于HTML5的网页设计及应用,Rust(官方文档重点总结),jQuery,前端vue.js,Javaweb开发,Python机器学习等 🥏主页链接:     

    2024年04月26日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包