对于Rust函数返回的Result,一般有三种处理方式
- 通过
?
直接向上层传递错误,前提条件是返回的错误类型能够转换成上层的错误类型 - match Result,处理Err,转成本函数的错误类型向上传递或者忽略继续运行
- 不处理(但编译器会报warning)
- 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 页
评论区
写评论还没有评论