ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

rust 错误处理

2022-06-08 08:03:55  阅读:205  来源: 互联网

标签:Ok rust err Err pub Result 错误处理 fn


rust 的错误处理十分优雅,没有 try-catch,也没有像是 go 一样的 if err != nil {...}
rust 的错误处理是函数式的,使用起来十分流畅,其应对错误处理的方式也有很多

rust 通过枚举 Result<T, E> 来进行错误处理,而对于不应该发生错误的地方,rust 提供了 Option<T> 枚举供我们使用

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

pub enum Option<T> {
    None,
    Some(T),
}

这里只说 rust 的 Result<T, E>

impl<T, E> Result<T, E> {
	// 当 Result 枚举的值是 Ok 的时候返回 true
	// 可用于只关注状态而不关注 Ok(T) 中的值的时候使用
	pub const fn is_ok(&self) -> bool {}

	// 当 Result 的值是 Err(E) 的时候返回 true
	pub const fn is_err(&self) -> bool {}

	// 返回 Ok(T) 中的值,并且消费掉 Result 本身
	// 如果 Result 的值是 Err 将会 panic,并将 msg
	// 作为信息输出
	pub fn expect(self, msg: &str) -> T {}

	// 是 Ok 就将值取出,并消费掉 Result,如果是 Err,
	// 就会 panic,与 expect 相比不能自定义信息
	// unwrap 方法十分形象,“把 Ok(T) 解包,取出里面的值”
	pub fn unwrap(self) -> T {}

	// 如果返回值是 Ok(T) 就解包,如果不是就将自己设置的
	// 默认值 default 返回
	pub fn unwrap_or(self, default: T) -> T {}

	// 如果是 Ok(T) 就解包(这个`解包`的说法不一定正确,只是
	// 我觉得比较好理解而已,没有什么好纠结的)
	// 如果不是 Ok(T) 即返回的是 Err(E),那就将 Err(E) 中的
	// 值取出来,交给闭包进行计算,返回值类型应该与 Ok(T)
	// 中的 T 一致
	pub fn unwrap_or_else<F>(self, op: F) -> T {}
	// where F: FnOnce(E) -> T {}
}

unwrap_or_else 举个例子

fn main() {
    let ok = get_ok_result().unwrap_or_else(|err| -> String {
        format!("{}", err)
    });

    let err = get_err_result().unwrap_or_else(|err| -> String {
        format!("{}", err)
    });

    println!("{}",ok);
    println!("{}",err);
}

fn get_ok_result() -> Result<String, String> {
    Ok("everything is working very well".to_owned())
}

fn get_err_result() -> Result<String, String> {
    Err("error happend here".to_owned())
}

结果:

everything is working very well
error happend here

To be continued...

标签:Ok,rust,err,Err,pub,Result,错误处理,fn
来源: https://www.cnblogs.com/slime04/p/16348479.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有