MST

星途 面试题库

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

在Rust中,如何定义一个简单的自定义错误类型?请给出代码示例,并说明如何在函数中返回这个自定义错误类型。
28.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 定义自定义错误类型: 在Rust中,可以通过定义一个结构体并为其实现std::error::Error trait来定义自定义错误类型。通常还会为其实现Display trait以便于格式化输出错误信息。
    use std::fmt;
    
    // 定义自定义错误结构体
    #[derive(Debug)]
    struct MyError {
        message: String,
    }
    
    // 实现Display trait,用于格式化输出错误信息
    impl fmt::Display for MyError {
        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
            write!(f, "{}", self.message)
        }
    }
    
    // 实现Error trait
    impl std::error::Error for MyError {}
    
  2. 在函数中返回自定义错误类型: 函数可以使用Result类型来返回成功值或自定义错误。
    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, 2) {
            Ok(result) => println!("结果: {}", result),
            Err(error) => eprintln!("错误: {}", error),
        }
    
        match divide(10, 0) {
            Ok(result) => println!("结果: {}", result),
            Err(error) => eprintln!("错误: {}", error),
        }
    }
    

上述代码中,首先定义了MyError作为自定义错误类型,然后在divide函数中,根据条件返回Result类型,当出现错误(除数为零)时返回Err包含自定义错误,正常时返回Ok包含计算结果。在main函数中,通过match语句处理divide函数的返回结果。