MST

星途 面试题库

面试题:Rust自定义错误类型实现多错误源头及处理

假设你正在开发一个数据库操作相关的Rust库,其中可能会出现数据库连接错误、SQL语句执行错误等不同类型的错误。请自定义错误类型来涵盖这些不同的错误源头,并展示如何在一个复杂的数据库操作函数链中传播和处理这些错误,同时说明如何使用`From` trait 进行错误类型的转换。
17.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 自定义错误类型
#[derive(Debug)]
enum DatabaseError {
    ConnectionError(String),
    SqlExecutionError(String),
}

// 实现 std::error::Error trait
impl std::error::Error for DatabaseError {}

// 实现 std::fmt::Display trait
impl std::fmt::Display for DatabaseError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            DatabaseError::ConnectionError(err) => write!(f, "数据库连接错误: {}", err),
            DatabaseError::SqlExecutionError(err) => write!(f, "SQL语句执行错误: {}", err),
        }
    }
}

// 模拟数据库连接函数
fn connect_to_database() -> Result<(), DatabaseError> {
    // 这里简单模拟连接失败的情况
    Err(DatabaseError::ConnectionError("连接失败".to_string()))
}

// 模拟执行SQL语句函数
fn execute_sql() -> Result<(), DatabaseError> {
    // 这里简单模拟执行失败的情况
    Err(DatabaseError::SqlExecutionError("执行失败".to_string()))
}

// 复杂的数据库操作函数链
fn complex_database_operation() -> Result<(), DatabaseError> {
    connect_to_database()?;
    execute_sql()?;
    Ok(())
}

// 自定义另一个错误类型
#[derive(Debug)]
struct OtherError(String);

// 实现 std::error::Error trait
impl std::error::Error for OtherError {}

// 实现 std::fmt::Display trait
impl std::fmt::Display for OtherError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "其他错误: {}", self.0)
    }
}

// 实现 From<OtherError> for DatabaseError
impl From<OtherError> for DatabaseError {
    fn from(err: OtherError) -> Self {
        DatabaseError::SqlExecutionError(err.0)
    }
}

fn main() {
    match complex_database_operation() {
        Ok(_) => println!("数据库操作成功"),
        Err(err) => println!("数据库操作失败: {}", err),
    }

    let other_err = OtherError("一些其他问题".to_string());
    let db_err: DatabaseError = other_err.into();
    println!("转换后的错误: {}", db_err);
}

在上述代码中:

  1. 自定义错误类型:定义了 DatabaseError 枚举类型,包含 ConnectionErrorSqlExecutionError 变体,用于表示数据库连接错误和 SQL 语句执行错误。
  2. 错误传播:在 complex_database_operation 函数中,通过 ? 操作符传播 connect_to_databaseexecute_sql 函数可能产生的错误。如果任何一个函数返回错误,complex_database_operation 也会返回错误。
  3. 错误处理:在 main 函数中,通过 match 语句处理 complex_database_operation 函数返回的结果,打印成功或失败信息。
  4. From trait 进行错误类型转换:定义了 OtherError 类型,并实现了 From<OtherError> for DatabaseError,这样可以将 OtherError 类型的错误转换为 DatabaseError 类型。在 main 函数中展示了如何使用 into 方法进行转换。