Rust的错误处理机制

2023-02-15

rust

在错误处理方面,Rust完胜Go。

先看代码,这是Go里面最让人讨厌的部分之一,跟C语言的错误处理有点类似,风格就是简单粗暴。

ret1, err1 := func1();
if err1 == nil {
   return err1;
}
ret2, err2 := func2();
if err2 == nil {
    return err2;
}
ret3, err3 := func3();
if err3 == nil {
    return err3;
}

没有比这样的错误处理方式更简陋的了,而Rust在这方面做的很好,同样的代码,可以写成这样:

let ret1 = func1()?;
let ret1 = func2()?;
let ret2 = func3()?;

问号在这里是一种语法糖,当返回Err时函数会直接返回,将Err传递到函数外层。这要求函数返回值也是Result。另一种用法,如果不关心中间结果,直接可以链式调用:

let ret = func1()?.func2()?.func3()?;

Rust如果不能忽略错误,例如需要打日志,可以用下面的方式:

let ret = func1().unwrap_or_else(|e|{println!("failed:{}", e); panic!();});

Result有若干方法可以用于不同场合,例如常用的expect、unwrap、and_then等等,可以默认返回Err或者Ok,也可以指定默认值,像or_else系列的方法还可以指定闭包完成一些额外的操作。

 
阅读