Стандартный трейт ошибки в Rust
Исход сбоя в стандартной библиотеке ожидает, что тип ошибки умеет печататься и помечен как ошибка. Трейт печати вы уже оформили; остается выполнить трейт ошибки, чтобы значение можно было класть во вторую ветку исхода.
Часто достаточно пустого блока выполнения: все нужное уже есть в тексте из трейта печати. Тогда компилятор считает тип полноценной ошибкой для цепочек сбоя и для обмена с другими частями кода, которые работают с этим трейтом.
Добавим пустое выполнение к уже оформленному типу:
#[derive(Debug)]
struct PathError {
path: String,
}
impl std::fmt::Display for PathError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "bad path {}", self.path)
}
}
impl std::error::Error for PathError {}
fn main() {
let err = PathError {
path: String::from("cfg"),
};
let outcome: Result<i32, PathError> = Err(err);
match outcome {
Ok(n) => println!("{}", n),
Err(e) => println!("{}", e),
}
}
Дан следующий код:
struct StepError {
step: u32,
}
impl std::fmt::Display for StepError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "step {}", self.step)
}
}
Подключите стандартный трейт ошибки пустым
блоком и верните Err с этим типом из
main, обработав исход через match.
Дан следующий код:
struct TagError {
tag: String,
}
Оформите печать с текстом "tag" и полем,
затем отметьте тип как ошибку. Положите значение
во вторую ветку Result и выведите текст.
Дан следующий код:
struct PortError {
port: u16,
}
Сделайте полный тип сбоя с печатью "port"
и числом, пустым трейтом ошибки и функцией
main, которая показывает сообщение из
Err.