前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >30.Rust-错误处理

30.Rust-错误处理

原创
作者头像
面向加薪学习
修改2022-09-04 11:51:01
3270
修改2022-09-04 11:51:01
举报
文章被收录于专栏:面向加薪学习面向加薪学习

Rust 语言也有错误这个概念,而且把错误分为两大类:可恢复不可恢复,相当于其它语言的 异常错误

Name

描述

Recoverable

可以被捕捉,相当于其它语言的异常 Exception

UnRecoverable

不可捕捉,会导致程序崩溃退出

panic!() 不可恢复错误

panic!() 程序立即退出,退出时调用者抛出退出原因。

一般情况下,当遇到不可恢复错误时,程序会自动调用 panic!()

代码语言:txt
复制
fn main() {
    panic!("出错啦");
    println!("Hello Rust"); // 不可能执行的语句
}
//输出
thread 'main' panicked at '出错啦', src/main.rs:2:5


let v = vec!["Go语言极简一本通","Go语言微服务架构核心22讲","从0到Go语言微服务架构师"];
v[5]; // 因为超出了数组的长度,所以会触发不可恢复错误

Result 枚举和可恢复错误

枚举的定义如下:

代码语言:txt
复制
enum Result<T,E> {
   OK(T),
   Err(E)
}

OK(T) T OK 时作为正常返回的值的数据类型。

Err(E) E Err 时作为错误返回的错误的类型。

代码语言:txt
复制
let f = File::open("abc.jpg"); //文件不存在,因此值为 Result.Err
println!("{:?}",f);

//输出
Err(Os { code: 2, kind: NotFound, message: "No such file or directory" })

unwrap() 和 expect()

unwrap() 函数的原型如下

代码语言:txt
复制
unwrap(self):T

unwrap是 Result<T, E>的方法,在实例上调用此方法时,如果是 Ok 枚举值,就会返回 Ok 中的对象,如果是 Err 枚举值,在运行时会 panic,报错信息是 format!("{}", error)。其缺点是,如果在不同地方都使用 unwrap,运行时出现 panic 的时候。

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

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

let result = is_even(11).unwrap();
println!("结果 {}",result);
//输出 thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "输入值,不是偶数"'

函数 expect() 的原型如下

代码语言:txt
复制
expect(self,msg:&str):T

expect方法的作用和unwrap类似,区别在于,expect方法接受msg: &str作为参数,它在运行时的panic信息为format!("{}: {}", msg, error),使用expect时,可以自定义报错信息,因此出现panic时比较容易定位。

代码语言:txt
复制
let f = File::open("abc.txt").expect("无法打开该文件"); // 文件不存在
//输出 thread 'main' panicked at '无法打开该文件: Os { code: 2, kind: NotFound, message: "No such file or directory" }'

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • panic!() 不可恢复错误
  • Result 枚举和可恢复错误
  • unwrap() 和 expect()
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档