< 返回版块

metaworm 发表于 2023-03-07 21:24

对于Rust函数返回的Result,一般有三种处理方式

  1. 通过?直接向上层传递错误,前提条件是返回的错误类型能够转换成上层的错误类型
  2. match Result,处理Err,转成本函数的错误类型向上传递或者忽略继续运行
  3. 不处理(但编译器会报warning)
  4. unwrap/except等方式 panic

如果错误能够向上传递,直接用第1种方法最好;如果是非常严重的错误,影响程序继续运行的,应该选择第4种处理方式直接panic

但很多场景下我们不能向上传递错误类型了或者并不想处理,比如在一个线程中或一个Future任务中,最好的方法是将错误通过日志记录下来,便于事后排查问题,可以选择第2钟处理方式,将错误记录到日志中

如果只是记录Err日志的话,每次都写一个match {Err(_) => {...}未免有些麻烦了,可以通过一个trait封装成一个方法调用来实现,log-error库就是干这个事的

LogError trait提供的log_error系列方法会把Result转成Option,类似于Result::ok方法,Ok(val)转为Some(val),Err(err)转为None,不过在将Err转为None的同时会把错误输出到日志中,这样也避免了不处理Result导致编译器产生的warning

use log_error::*;
use std::io::Error;

fn main() {
    simple_logger::SimpleLogger::new().env().init().unwrap();

    // ❌ 繁琐的处理方式
    // match output() {
    //     Ok(_) => {}
    //     Err(err) => {
    //         log::error!("output: {err}");
    //     }
    // }

    // ✔️ 优雅的处理方式
    output().log_error("output");
}

fn output() -> Result<(), Error> {
    std::fs::write("/path/not/exists", "some data".as_bytes())
}

这是个非常小的库,只有一个一百多行代码的lib.rs文件,可以放心食用


Ext Link: https://docs.rs/log-error/latest/log_error/

评论区

写评论

还没有评论

1 共 0 条评论, 1 页