Rust 的错误处理
在 Rust 中,错误处理通常使用 Result 结构体来封装可能发生错误的函数返回值。这种方式不仅使错误处理更加简洁和清晰,还避免了像 golang 那样在代码中充斥着大量的 if err != nil 语句。
基本使用
Result<T, E> 是一个枚举类型,使用两个泛型参数:一个表示成功时的返回值类型 T,另一个表示错误时的异常值类型 E。以下是一个简单的例子:
fn function() -> Result<A, E> {
if something_error() {
return Err(E {});
}
Ok(A {})
}
嵌套 Result 的处理
在实际开发中,我们常常需要将函数调用中的错误向上层返回,并在上层进行处理。这里分为两种情况:错误类型相同和错误类型不同。
错误类型相同
当调用的函数和当前函数的错误类型相同时,可以使用 ? 操作符来简化错误处理。如果被调用的函数返回了错误,? 操作符会使当前函数立即返回该错误:
fn A() -> Result<(), E> {
B()?;
Ok(())
}
fn B() -> Result<(), E> {
if something_error() {
return Err(E {});
}
Ok(())
}
错误类型不同
当调用的函数和当前函数的错误类型不同时,可以使用 map_err 方法将错误类型转换为当前函数所需的错误类型,然后再使用 ? 操作符:
fn A() -> Result<(), ErrA> {
B().map_err(|_| ErrA {})?;
Ok(())
}
fn B() -> Result<(), ErrB> {
if something_error() {
return Err(ErrB {});
}
Ok(())
}
将 Result 转换为 Option
有时,我们需要将 Result 类型转换为 Option 类型。使用 Result 的 ok() 方法可以轻松实现这一转换。在正常情况下,返回 Some 包含的数据;在发生错误时,返回 None:
fn A() -> Option<Data> {
let data = B().ok()?;
Some(data)
}
fn B() -> Result<Data, E> {
if something_error() {
return Err(E {});
}
Ok(Data {})
}
通过这种方式,可以简洁地处理可能的错误,并在错误发生时优雅地返回 Option::None。
本文使用 markdown.com.cn 排版
正文完