首页 > 其他分享 >无涯教程-Rust - 错误处理

无涯教程-Rust - 错误处理

时间:2024-01-25 15:31:41浏览次数:35  
标签:错误 Err unwrap 无涯 fn println 错误处理 main Rust

在Rust中,错误可以分为两大类,如下表所示。

Name & 描述 Usage

Recoverable

可恢复的错误

Result enum

UnRecoverable

无法恢复的错误

panic macro

与其他编程语言不同,Rust没有Exception异常,它返回可恢复错误的枚举Result <T,E>,如果程序遇到不可恢复的错误,则调用panic宏。

Panic宏

panic!宏允许程序立即终止并向程序调用者提供反馈,当程序达到不可恢复的状态时,应使用它。

fn main() {
   panic!("Hello");
   println!("End of main"); //无法执行
}

在上面的示例中,程序在遇到 panic!宏时将立即终止。

thread 'main' panicked at 'Hello', main.rs:3

Panic!宏操作

fn main() {
   let a=[10,20,30];
   a[10]; //由于无法到达索引 10
}
warning: this expression will panic at run-time
--> main.rs:4:4
  |
4 | a[10];
  | ^^^^^ index out of bounds: the len is 3 but the index is 10

$main
thread 'main' panicked at 'index out of bounds: the len 
is 3 but the index is 10', main.rs:4
note: Run with `RUST_BACKTRACE=1` for a backtrace.

一个程序可以引起panic!宏,如下例所示-

fn main() {
   let no=13; 

   if no%2 == 0 {
      println!("Thank you , number is even");
   } else {
      panic!("NOT_AN_EVEN"); 
   }
   println!("End of main");
}

如果分配给变量的值是奇数,则上面的示例将返回错误。

thread 'main' panicked at 'NOT_AN_EVEN', main.rs:9
note: Run with `RUST_BACKTRACE=1` for a backtrace.

输出枚举

枚举结果 - <T,E>可用于处理可恢复的错误,它有两个变体-OK和Err,T和E是通用类型参数,T表示在OK变量中成功情况下将返回的值的类型,E表示在Err变量中失败情况下将返回的错误的类型。

enum Result<T,E> {
   OK(T),
   Err(E)
}

让我们借助示例了解这一点-

use std::fs::File;
fn main() {
   let f=File::open("main.jpg"); 
   //此文件不存在
   println!("{:?}",f);
}

如果文件已经存在,则程序返回 OK(File),如果找不到文件,则返回 Err(Error)。

Err(Error { repr: Os { code: 2, message: "No such file or directory" } })

现在让我们看看如何处理Err变体。

以下示例处理使用 match 语句打开文件时返回的错误

use std::fs::File;
fn main() {
   let f=File::open("main.jpg");   //main.jpg 不存在
   match f {
      Ok(f)=> {
         println!("file found {:?}",f);
      },
      Err(e)=> {
         println!("file not found\n{:?}",e);   //出错
      }
   }
   println!("end of main");
}

注意-尽管未找到文件,程序仍会打印 main 事件的 end 。这意味着程序已正常处理错误。

file not found
Os { code: 2, kind: NotFound, message: "The system cannot find the file specified." }
end of main

输出枚举示例

如果数字不是偶数,则 is_even 函数将返回错误, main()函数处理此错误。

fn main(){
   let result=is_even(13);
   match result {
      Ok(d)=>{
         println!("no is even {}",d);
      },
      Err(msg)=>{
         println!("Error msg is {}",msg);
      }
   }
   println!("end of main");
}
fn is_even(no:i32)->Result<bool,String> {
   if no%2==0 {
      return Ok(true);
   } else {
      return Err("NOT_AN_EVEN".to_string());
   }
}

注意-由于main函数可以正常处理错误,因此会打印 main 语句的 end 。

Error msg is NOT_AN_EVEN
end of main

unwrap()和Expect()

标准库包含两个枚举的两个助手方法-Result <T,E>和Option <T>实现,您可以使用它们来简化错误情况,在这些情况下,您实际上并不希望失败。如果方法成功,则使用“expect"函数提取结果。

Sr.No Method Signature & Remark
1 unwrap

unwrap(self):T

期望self是Ok/Some并返回其中包含的值,如果它是 Err 或 None ,则会引发错误并显示错误内容。

2 expect

expect(self, msg: &str): T

行为就像解包一样,除了它会在错误内容之前输出自定义消息。

unwrap() 函数

unwrap()函数返回操作成功的实际结果,如果操作失败,它将返回带有默认错误消息的紧急消息,此函数是match语句的简写。

fn main(){
   let result=is_even(10).unwrap();
   println!("result is {}",result);
   println!("end of main");
}
fn is_even(no:i32)->Result<bool,String> {
   if no%2==0 {
      return Ok(true);
   } else {
      return Err("NOT_AN_EVEN".to_string());
   }
}
result is true
end of main

修改上面的代码,将一个奇数传递给 is_even()函数。

unwrap()函数将出现错误并返回默认错误消息,如下所示

thread 'main' panicked at 'called `Result::unwrap()` on 
an `Err` value: "NOT_AN_EVEN"', libcore\result.rs:945:5
note: Run with `RUST_BACKTRACE=1` for a backtrace

expect() 函数

如果出现紧急情况,程序可以返回自定义错误消息。这在以下示例中显示-

use std::fs::File;
fn main(){
   let f=File::open("pqr.txt").expect("File not able to open");
   //file does not exist
   println!("end of main");
}

函数Expect()与unwrap()类似,唯一的区别是可以使用期望显示自定义错误消息。

thread 'main' panicked at 'File not able to open: Error { repr: Os 
{ code: 2, message: "No such file or directory" } }', src/libcore/result.rs:860
note: Run with `RUST_BACKTRACE=1` for a backtrace.

参考链接

https://www.learnfk.com/rust/rust-error-handling.html

标签:错误,Err,unwrap,无涯,fn,println,错误处理,main,Rust
From: https://blog.51cto.com/u_14033984/9412438

相关文章

  • Rust 一个 I/O 项目:构建一个命令行程序
    本篇在原文基础上有删减和添加,增加了一些细节内容,原文请参考一个I/O项目:构建一个命令行程序。目录接受命令行参数读取参数值将参数值保存进变量读取文件重构改进模块性和错误处理二进制项目的关注分离提取参数解析器组合配置值使用clone的权衡取舍创建一个Config的构造函数......
  • rust使用lazy_static对全局变量多线程并发读写示例
    首先需要在项目依赖Cargo.toml添加lazy_static依赖项[dependencies]lazy_static="1.4.0"示例代码如下:uselazy_static::lazy_static;usestd::sync::{RwLock,RwLockReadGuard,RwLockWriteGuard};usestd::thread;#[derive(Debug)]structSharedData{data:Vec<......
  • 无涯教程-Rust - 元组(Tuple)
    元组是复合数据类型,标量类型只能存储一种类型的数据,如一个i32变量只能存储一个整数值。在复合类型中,我们可以存储多个值,并且可以是不同类型。元组的长度是固定的,一旦声明,它们就无法增长或缩小,元组索引从0开始。Tuple-语法//语法1lettuple_name:(data_type1,data_type2,d......
  • 2024-1-25axios错误处理
    目录axios错误处理axios错误处理该错误是当时在POST案例出现的,当提交过一次用户后再次提交出现了报错。场景:再次注册相同的账号,会遇到错误信息处理:用更直观的方式,给普通用户展示错误信息错误处理固定格式语法:在then方法的后面,通过点语法调用catch方法,传入回调函数error并定......
  • 无涯教程-Rust - 变量声明
    变量是程序可以操纵的命名存储,Rust中的变量与特定的数据类型相关联。数据类型决定变量的内存大小,可以存储在该内存中的值的范围以及可以对该变量执行的一组操作。命名规则在本节中,我们将学习命名变量的不同规则。变量的名称可以由字母,数字和下划线字符组成。必须以字母或下划......
  • 无涯教程-Rust - 数据类型
    Rust是一种静态类型的语言,Rust中的每个值都需要指定某种数据类型,编译器也可以根据分配给它的值自动推断变量的数据类型。声明变量使用let关键字声明一个变量。fnmain(){letcompany_string="LearnFk";//字符串类型letrating_float=4.5;//浮......
  • 无涯教程-Rust - 环境设置
    通过rustup(一种用于管理Rust版本和相关工具的基于控制台的工具),可以轻松安装Rust。在Windows上安装让我们学习如何在Windows上安装RUST。必须强制使用C++工具安装VisualStudio2013或更高版本,才能在Windows上运行Rust程序,首先,从此处下载VisualStudioVS2013Express......
  • 无涯教程-CSS3 - 用户界面
    用户界面属性允许您将任何元素更改为几个标准用户界面元素之一。CSS3用户界面中使用的一些常用属性。Sr.No.Value&Remark1appearance用于允许用户将元素制作为用户界面元素。2box-sizing允许用户以清晰的方式将元素固定在区域上。3icon用于在区域上提供图标。......
  • 无涯教程-CSS3 - 多列布局
    CSS3可以将文本内容设计成像报纸一样的多列布局。一些最常用的多列属性,如下所示-Sr.No.Value&Remark1column-count 指定元素应该被分割的列数。2column-fill指定如何填充列3column-gap 指定列与列之间的间隙4column-rule所有column-rule-*属性的简......
  • 无涯教程-CSS3 - 字体属性(Font)
    Web字体用于允许CSS中的字体,这些字体未在本地系统上安装。Sr.No.Font&Remark1TrueTypeFonts(TTF)TrueType是Apple和Microsoft在1980年代后期开发的轮廓字体标准,它成为Windows和MAC操作系统最常用的字体。2OpenTypeFonts(OTF)OpenType是Microsoft开发的可缩放计......