面试题答案
一键面试在Rust中,自定义错误类型并实现 std::error::Error
特性的示例代码如下:
use std::error::Error;
use std::fmt;
// 自定义错误类型
#[derive(Debug)]
struct MyError {
message: String,
}
impl fmt::Display for MyError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.message)
}
}
impl Error for MyError {
fn source(&self) -> Option<&(dyn Error + 'static)> {
// 通常这里返回导致此错误的底层错误,如果有的话。
// 这里没有底层错误,所以返回None。
None
}
}
在上述代码中,MyError
结构体就是自定义的错误类型。
std::error::Error
特性中各个方法的作用:
source(&self) -> Option<&(dyn Error + 'static)>
:这个方法返回导致当前错误的底层错误,如果当前错误没有底层错误,则返回None
。它主要用于提供错误链的信息,当一个错误是由另一个错误引发时,可以通过这个方法追溯到原始错误。例如,在处理文件读取错误时,如果是因为底层的系统调用错误导致的文件读取失败,就可以通过source
方法返回系统调用错误。description(&self) -> &str
:在Rust 1.33版本之后,这个方法被弃用,推荐使用Display
特性的fmt
方法来代替。它原本用于返回错误的描述信息。cause(&self) -> Option<&dyn Error>
:这个方法也在Rust 1.33版本之后被弃用,同样由source
方法替代,用于获取导致当前错误的原因。