面试题答案
一键面试在Rust中,可以通过以下步骤自定义一个简单的错误类型并实现std::error::Error
trait :
- 定义一个结构体来表示错误类型。
- 为该结构体实现
std::fmt::Debug
、std::fmt::Display
trait ,Display
trait 用于格式化错误信息,Debug
trait 通常用于调试时打印错误信息。 - 为该结构体实现
std::error::Error
trait ,std::error::Error
trait 会自动继承std::fmt::Debug
和std::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),
}
}
在上述代码中:
- 定义了
MyError
结构体,它包含一个String
类型的message
字段,用于存储错误信息。 - 为
MyError
结构体实现了fmt::Display
trait ,使得可以使用println!("{}", error)
来打印错误信息。 - 为
MyError
结构体实现了std::error::Error
trait ,这样MyError
就可以作为错误类型在Result
中使用。 divide
函数在除数为0时返回Err(MyError)
,否则返回Ok
。在main
函数中调用divide
函数并处理可能的错误。