文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

理解 Rust 中的不可恢复错误和可恢复错误

2024-11-28 13:39

关注

Rust 中的不可恢复错误:Panic 宏

在 Rust 中,不可恢复错误指的是程序无法安全继续执行的情况。这些错误通过 panic! 宏来处理。当 panic! 被触发时,应用程序将停止执行,并展开栈,这通常会导致进程终止。

示例:索引越界

例如,如果你尝试访问超出向量范围的索引,将会引发 panic:

let names = vec!["Sunny", "Hugo", "Charlie"];
names[10]; // 这将导致 panic

// thread 'main' panicked at src/main.rs:5:10:
// index out of bounds: the len is 3 but the index is 10

在数据无效或无法从错误中恢复的情况下,你可以手动调用 panic! 宏:

panic!("The app cannot continue, please fix data");

// thread 'main' panicked at src/main.rs:2:5:
// The app cannot continue, please fix data

不可恢复错误总结

当程序因关键问题(如数据无效或违反程序假设的情况)而无法继续时,就会发生不可恢复错误。panic! 宏用于在这些错误发生时停止程序执行。

Rust 中的可恢复错误:Result 枚举

与此相对,可恢复错误是指程序可以处理并继续运行的错误。这类错误通过 Result 枚举来处理。

Result 枚举有两个变体:

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

示例:文件未找到

如果你尝试打开一个不存在的文件,可以在不崩溃程序的情况下处理错误。以下是使用 Result 枚举和 match 语句的示例:

use std::fs::File;

fn main() {
    let file = File::open("bad_file.png");
    match file {
        Ok(f) => {
            println!("File found {:?}", f);
        },
        Err(e) => {
            println!("File not found {:?}", e);
        }
    }

    println!("App is still running...");
}

// File not found Os { code: 2, kind: NotFound, message: "The system cannot find the file specified." }
// App is still running...

如你所见,程序没有 panic,而是通过打印错误信息来处理错误,应用程序继续运行。

错误处理的辅助方法

你可能见过 Rust 中的 unwrap() 方法,并想知道它的作用。unwrap() 是处理 Result 类型的快捷方式,但存在风险。如果结果是 Ok,unwrap() 返回值。然而,如果结果是 Err,unwrap() 将导致 panic。

你可以用 unwrap() 替换 match 语句:

let file = File::open("bad_file.png").unwrap();

// thread 'main' panicked at src/main.rs:4:43:
// called `Result::unwrap()` on an `Err` value: Os { code: 2, kind: NotFound, message: "The system cannot find the file specified." }

如你所见,如果文件未找到,程序将 panic 并停止运行。

第二个选项是 expect()。

expect() 方法类似于 unwrap(),但允许你提供自定义错误信息。如果你希望提供更多关于错误的上下文,而不仅仅依赖于默认的 panic 信息,这将非常有用。

let file = File::open("bad_file.png").expect("Ooops something went wrong");

// thread 'main' panicked at src/main.rs:4:43:
// Ooops something went wrong: Os { code: 2, kind: NotFound, message: "The system cannot find the file specified." }

结论

来源:Rust开发笔记内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯