我是靠谱客的博主 无聊超短裙,最近开发中收集的这篇文章主要介绍快速了解:Rust 的错误处理panic! 宏 —— 粗暴地抛出错误Result 枚举类型 —— 优雅地返回错误更快捷的错误处理,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

panic! 宏 —— 粗暴地抛出错误

在程序中抛出产生错误信息很容易,用 panic! 宏即可,程序运行到 panic! 会无条件结束,并返回错误信息。

fn main() {
    panic!("error!");
    println!("Hello, world!");
}

================ run result ==============

thread 'main' panicked at 'error!', srcmain.rs:2:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

Result 枚举类型 —— 优雅地返回错误

Result 枚举类型可以帮助我们优雅地返回函数错误,从而让调用者从容地处理错误。

fn foo(x: i32) -> Result<i32, String> {
    if x >= 0 {
        return Ok(x);
    } else {
        return Err("Error: Less than zero!".to_string());
    }
}

fn main() {
    let a = foo(123);
    let b = foo(-123);
    println!("a={:?}", a);
    println!("b={:?}", b);
}


================ run result ==============

a=Ok(123)
b=Err("Error: Less than zero!")

在复杂一些,加入自己的错误处理代码:

fn foo(x: i32) -> Result<i32, String> {
    if x >= 0 {
        return Ok(x);
    } else {
        return Err("Error: Less than zero!".to_string());
    }
}

fn bar(x: i32) -> Result<i32, String> {
    let t = foo(x);
    match t {
        Ok(i) => Ok(i),
        Err(s) => Err(s),
    }
}
fn main() {
    let a = bar(123);
    let b = bar(-123);
    println!("a={:?}", a);
    println!("b={:?}", b);
}

================ run result ==============

a=Ok(123)
b=Err("Error: Less than zero!")

更快捷的错误处理

Rust 提供的错误处理“短路”式处理模式,下面的函数 bar 代码与上面的等价,但是简化了很多:

fn bar(x: i32) -> Result<i32, String> {
    let t = foo(x)?;
    Ok(x)
}

foo(x)后面紧跟的 ? 号,表示如果出错则直接返回错误。当然,这必须在 foo、bar 两个函数错误返回类型完全一致时才有效。例如,函数 bar 可以写成如下形式,尽管返回的数据类型不一样,但错误信息类型一致就可以用短路模式处理错误信息。

fn bar(x: i32) -> Result<f64, String> {
    let t = foo(x)?;
    Ok(x as f64)
}

我觉得 Rust 的错误处理模式足以碾压目前所有的编程语言了。Rust 更进一步的错误处理技巧,我们将另写文章讨论。

最后

以上就是无聊超短裙为你收集整理的快速了解:Rust 的错误处理panic! 宏 —— 粗暴地抛出错误Result 枚举类型 —— 优雅地返回错误更快捷的错误处理的全部内容,希望文章能够帮你解决快速了解:Rust 的错误处理panic! 宏 —— 粗暴地抛出错误Result 枚举类型 —— 优雅地返回错误更快捷的错误处理所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(74)

评论列表共有 0 条评论

立即
投稿
返回
顶部