MST

星途 面试题库

面试题:Rust中自定义错误类型的基本结构与实现

请阐述在Rust中如何自定义一个简单的错误类型,并给出一个示例。要求该错误类型实现`std::error::Error` trait,且能包含自定义的错误信息。
25.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在Rust中,可以通过以下步骤自定义一个简单的错误类型并实现std::error::Error trait :

  1. 定义一个结构体来表示错误类型。
  2. 为该结构体实现std::fmt::Debugstd::fmt::Display trait ,Display trait 用于格式化错误信息,Debug trait 通常用于调试时打印错误信息。
  3. 为该结构体实现std::error::Error trait ,std::error::Error trait 会自动继承std::fmt::Debugstd::fmt::Display

以下是示例代码:

use std::error::Error;
use std::fmt;

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

// 实现fmt::Display trait
impl fmt::Display for MyError {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(f, "{}", self.message)
    }
}

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

fn divide(a: i32, b: i32) -> Result<i32, MyError> {
    if b == 0 {
        Err(MyError {
            message: "除数不能为零".to_string(),
        })
    } else {
        Ok(a / b)
    }
}

你可以像这样使用这个自定义错误类型:

fn main() {
    match divide(10, 0) {
        Ok(result) => println!("结果: {}", result),
        Err(e) => println!("错误: {}", e),
    }
}

在上述代码中:

  1. 定义了MyError 结构体,它包含一个String 类型的message 字段,用于存储错误信息。
  2. MyError 结构体实现了fmt::Display trait ,使得可以使用println!("{}", error) 来打印错误信息。
  3. MyError 结构体实现了std::error::Error trait ,这样MyError 就可以作为错误类型在Result 中使用。
  4. divide 函数在除数为0时返回Err(MyError) ,否则返回Ok 。在main 函数中调用divide 函数并处理可能的错误。