MST
星途 面试题库

面试题:Rust结构体中嵌套错误处理逻辑的设计与优化

有一个复杂的Rust结构体 `Order`,它包含多个子结构体 `Customer`、`Product` 等,在 `Order` 实例化过程中,每个子结构体的创建都可能产生不同类型的错误。例如 `Customer` 结构体创建时可能因为缺少必要信息报错,`Product` 结构体创建时可能因为库存不足报错。请设计一个合理的错误处理机制,使得 `Order` 的实例化过程能够清晰地处理这些不同类型的错误,并且在错误发生时能够正确返回有意义的错误信息。同时,思考如何优化这个错误处理逻辑以提高代码的可读性和可维护性。
35.6万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 定义错误类型
    • 首先,为 CustomerProduct 分别定义错误类型。
    // 定义Customer创建可能出现的错误
    #[derive(Debug)]
    struct CustomerError {
        message: String,
    }
    // 定义Product创建可能出现的错误
    #[derive(Debug)]
    struct ProductError {
        message: String,
    }
    // 定义Order创建可能出现的错误
    #[derive(Debug)]
    enum OrderError {
        CustomerError(CustomerError),
        ProductError(ProductError),
    }
    
  2. 定义子结构体
    • CustomerProduct 为例,展示其创建时如何返回错误。
    struct Customer {
        name: String,
    }
    impl Customer {
        fn new(name: Option<String>) -> Result<Self, CustomerError> {
            match name {
                Some(n) => Ok(Customer { name: n }),
                None => Err(CustomerError {
                    message: "Missing necessary information for customer".to_string(),
                }),
            }
        }
    }
    struct Product {
        name: String,
        stock: u32,
    }
    impl Product {
        fn new(name: String, stock: u32) -> Result<Self, ProductError> {
            if stock == 0 {
                Err(ProductError {
                    message: "Stock is insufficient".to_string(),
                })
            } else {
                Ok(Product { name, stock })
            }
        }
    }
    
  3. 定义 Order 结构体及其实例化函数
    struct Order {
        customer: Customer,
        product: Product,
    }
    impl Order {
        fn new(customer_name: Option<String>, product_name: String, product_stock: u32) -> Result<Self, OrderError> {
            let customer = Customer::new(customer_name)?;
            let product = Product::new(product_name, product_stock)?;
            Ok(Order { customer, product })
        }
    }
    
  4. 优化建议
    • 模块化:将错误类型定义、子结构体定义和 Order 结构体定义分别放在不同的模块中,这样可以使代码结构更清晰,提高可读性和可维护性。例如:
      • 创建 customer.rs 文件定义 Customer 结构体及其错误类型和相关方法。
      • 创建 product.rs 文件定义 Product 结构体及其错误类型和相关方法。
      • main.rsorder.rs 中定义 Order 结构体及其实例化函数,并处理不同模块的导入。
    • 使用 thiserrorthiserror 库可以更方便地定义错误类型,减少样板代码。例如:
      use thiserror::Error;
      // 定义Customer创建可能出现的错误
      #[derive(Error, Debug)]
      #[error("Missing necessary information for customer")]
      struct CustomerError;
      // 定义Product创建可能出现的错误
      #[derive(Error, Debug)]
      #[error("Stock is insufficient")]
      struct ProductError;
      // 定义Order创建可能出现的错误
      #[derive(Error, Debug)]
      enum OrderError {
          #[error("Customer error: {0}")]
          CustomerError(#[from] CustomerError),
          #[error("Product error: {0}")]
          ProductError(#[from] ProductError),
      }
      
      这样定义错误类型后,错误信息的生成和转换更加简洁和直观。