MST

星途 面试题库

面试题:Rust结构体富错误处理下的错误传播与转换

假设有一个Rust结构体`DatabaseOperation`,其方法执行数据库查询操作,可能会遇到`DatabaseError`(自定义错误类型)。现在要求将这个结构体中的方法调用链上的错误,按照不同的业务场景,传播或转换为`ApplicationError`(另一个自定义错误类型)。请详细说明实现思路,并编写相关代码示例。
18.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义DatabaseErrorApplicationError这两个自定义错误类型。
  2. DatabaseOperation结构体的方法中,通过Result类型来处理可能出现的DatabaseError
  3. 根据不同的业务场景,在方法调用链中,使用map_err等方法将DatabaseError转换为ApplicationError,或者直接传播错误。

代码示例

// 定义DatabaseError自定义错误类型
#[derive(Debug)]
struct DatabaseError {
    message: String,
}

// 定义ApplicationError自定义错误类型
#[derive(Debug)]
struct ApplicationError {
    message: String,
}

// DatabaseOperation结构体
struct DatabaseOperation;

impl DatabaseOperation {
    // 模拟数据库查询方法,可能返回DatabaseError
    fn query_database(&self) -> Result<String, DatabaseError> {
        // 这里简单模拟返回一个错误,实际应用中可能是真正的数据库操作
        Err(DatabaseError {
            message: "Database query failed".to_string(),
        })
    }

    // 业务方法,调用query_database并处理错误
    fn business_operation(&self) -> Result<String, ApplicationError> {
        self.query_database()
          .map_err(|db_err| ApplicationError {
                message: format!("Business operation failed due to: {}", db_err.message),
            })
    }
}

fn main() {
    let db_operation = DatabaseOperation;
    match db_operation.business_operation() {
        Ok(result) => println!("Result: {}", result),
        Err(app_err) => eprintln!("Application Error: {:?}", app_err),
    }
}