MST

星途 面试题库

面试题:Rust错误处理文档化与错误传播的结合应用

在一个Rust项目中,有一个模块`network`用于处理网络请求,模块内有函数`send_request`发送网络请求,可能返回`NetworkError`类型错误(自定义),其变体包含`ConnectError`、`TimeoutError`等。另外有一个更高层的函数`perform_operation`调用`send_request`,并根据不同的`NetworkError`变体进行不同的处理逻辑,比如`ConnectError`需要重试,`TimeoutError`需要记录日志并返回特定错误给调用者。请详细阐述如何在代码中通过文档化清晰地表达整个错误处理流程,包括错误类型定义、函数文档注释等。
27.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

错误类型定义

// 定义NetworkError枚举,包含ConnectError和TimeoutError变体
#[derive(Debug)]
pub enum NetworkError {
    ConnectError,
    TimeoutError,
}

send_request函数定义与文档注释

/// 发送网络请求
///
/// # 可能返回
/// `Ok(_)`:网络请求成功
/// `Err(NetworkError::ConnectError)`:连接错误
/// `Err(NetworkError::TimeoutError)`:超时错误
pub fn send_request() -> Result<(), NetworkError> {
    // 实际网络请求逻辑
    // 这里假设随机返回一个错误,仅作示例
    if rand::random::<bool>() {
        Err(NetworkError::ConnectError)
    } else {
        Err(NetworkError::TimeoutError)
    }
}

perform_operation函数定义与文档注释

use std::fmt::Debug;
use std::time::Duration;
use std::thread;

/// 执行高层操作,调用send_request并处理不同错误
///
/// 此函数会根据`send_request`返回的`NetworkError`进行不同处理:
/// - `ConnectError`:重试3次,每次间隔1秒
/// - `TimeoutError`:记录日志并返回特定错误给调用者
///
/// # 返回
/// `Ok(_)`:操作成功
/// `Err(OperationError)`:操作失败
pub fn perform_operation() -> Result<(), OperationError> {
    for _ in 0..3 {
        match send_request() {
            Ok(_) => return Ok(()),
            Err(NetworkError::ConnectError) => {
                println!("ConnectError, retrying...");
                thread::sleep(Duration::from_secs(1));
            }
            Err(NetworkError::TimeoutError) => {
                println!("TimeoutError, logging...");
                return Err(OperationError::Timeout);
            }
        }
    }
    Err(OperationError::ConnectFailed)
}

// 定义高层操作的错误类型
#[derive(Debug)]
pub enum OperationError {
    ConnectFailed,
    Timeout,
}