thiserror
Крейт thiserror
містить макроси, які допомагають уникнути повторювань при визначенні типів помилок. Він містить похідні макроси, які допомагають реалізувати From<T>
, Display
та трейтError
.
use std::fs; use std::io::Read; use thiserror::Error; #[derive(Error)] enum ReadUsernameError { #[error("I/O помилка: {e}")] IoError(#[from] io::Error), #[error("Не знайдено імені користувача в {0}")] EmptyUsername(String), } fn read_username(path: &str) -> Result<String, ReadUsernameError> { let mut username = String::with_capacity(100); File::open(path)?.read_to_string(&mut username)?; if username.is_empty() { return Err(ReadUsernameError::EmptyUsername(String::from(path))); } Ok(username) } fn main() { //fs::write("config.dat", "").unwrap(); match read_username("config.dat") { Ok(username) => println!("Ім'я користувача: {username}"), Err(err) => println!("Помилка: {err:?}"), } }
This slide should take about 5 minutes.
- Похідний макрос
Error
надаєтьсяthiserror
і має багато корисних атрибутів для компактного визначення типів помилок. - Повідомлення з
#[error]
використовується для отримання трейтуDisplay
. - Зауважте, що похідний макрос (
thiserror::
)Error
, хоча і має ефект реалізації трейту (std::error::
)Error
, не є тим самим; трейти та макроси не мають спільного простору імен.