Rust 的错误处理

189次阅读

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 类型。使用 Resultok() 方法可以轻松实现这一转换。在正常情况下,返回 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 排版

正文完
 0
liushui
版权声明:本站原创文章,由 liushui 2024-08-19发表,共计1128字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。