错误处理

Rust将错误分成两大类

  • 不可复原的(unrecoverable)
  • 可复原的(recoverable)

至於什麽时候该用什麽样的错误就要看使用情境了

例如程序启动时读不到设定档这个就可以使用不可复原的错误

不可复原的错误使用panic!

fn main() {
    panic!("恐慌性错误");
}

输出
thread 'main' panicked at '恐慌性错误', main.rs:2:5
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

panic会印出错误讯息以及第几行的讯息,还有提示可以设定RUST_BACKTRACE环境变数显示错误回朔资讯

下面执行时增加环境变数RUST_BACKTRACE=1

RUST_BACKTRACE=1 ./main

输出
thread 'main' panicked at '恐慌性错误', main.rs:2:5
stack backtrace:
   0: std::panicking::begin_panic
   1: main::main
   2: core::ops::function::FnOnce::call_once
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

这时候可以看到简略的错误,也可以设定RUST_BACKTRACE=full会列出整个过程

Rust的panic不像Golang可以recover回来

可复原的的错误使用Result

Resut是个枚举型别

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

Reust是枚举型别就可以透过match来判断是回传OK还是回传Err,再依里面的泛型参数取值

use std::fs::File;

fn main() {
    let f = File::open("hello.txt");

    let _ = match f {
        Ok(file) => {
            println!("{:?}", file)
        }
        Err(error) => {
            println!("{:?}", error)
        }
    };
}

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

如果觉得match判断错误太麻烦,也可以透过unwrap或expect来直接产生panic错误

let f = File::open("hello.txt").unwrap(); // 无法指定错误讯息
let f = File::open("hello.txt").expect("开启hello.txt错误"); // 可以指定错误讯息

也可以在写函式时回传Result型别,这边简单定义Result泛型型别

fn main() {
    let ok = return_result_ok();
    println!("{:?}", ok);
    let error = return_result_error();
    println!("{:?}", error);
}

fn return_result_ok() -> Result<String, String> {
    let s = String::from("成功");
    return Ok(s);
}

fn return_result_error() -> Result<String, String> {
    let s = String::from("失败");
    return Ok(s);
}

<<:  Day.29 部署环境 - 监控系统状态(Percona Monitoring and Management)

>>:  用React刻自己的投资Dashboard Day22 - API与前端资料需求比对

[Day02] 想要维度提升,先为自己铺路

在与团队成员的定期面谈中,一个很常被问到的问题:「可以给我一点职涯发展的建议吗?我要怎麽做,才能成为...

Day 9 - Container With Most Water

大家好,我是毛毛。ヾ(´∀ ˋ)ノ 废话不多说开始今天的解题Day~ 11. Container W...

[Git] authentication with ssh key

Step1: 建立ssh公钥及私钥 安装git 传送门,打开git bash执行下列指令 ssh-k...

Day26-Kaggle Titanic迈进前5% part(3)

前面两天,我们对需要用的栏位做了特徵工程、缺失值的补充、值得转换等 我们已经将资料前处理做得差不多了...

第一篇笔记-制作具有RPG要素的互动式健身会员系统

这是一篇记录我大专写到一半的笔记文,单纯是觉得写code写出了一点成就感,也是为了能记住曾经走过的歪...