0Pricing
Learn Rust Coding · Lekcja

thiserror

Niestandardowe typy błędów

thiserror to bezpłatna lekcja Learn Rust Coding na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Learn Rust Coding, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Learn Rust Coding zawiera 4 lekcji w sumie.

Po co własne błędy?

Biblioteki powinny udostępniać znaczące typy błędów, aby kod je wywołujący mógł reagować na konkretne niepowodzenia. Ręczne tworzenie takich typów oznacza dużo powtarzalnego kodu. Crate thiserror wygeneruje go za Pana/Panią.

Dodawanie thiserror

Należy dodać go jako zależność. Jest to crate z derive macro, który nie powoduje żadnego kosztu w czasie działania programu.

[dependencies]
thiserror = "1.0"

Definiowanie enuma błędów

Należy wyprowadzić Error dla enuma, w którym każdy wariant reprezentuje odrębne niepowodzenie. Atrybut #[error("...")] dostarcza komunikat Display.

use thiserror::Error;

#[derive(Error, Debug)]
pub enum DataError {
    #[error("item not found")]
    NotFound,
    #[error("invalid input: {0}")]
    Invalid(String),
}

Interpolowanie pól

Łańcuch komunikatu może odwoływać się do pól nazwanych lub pozycyjnych, dzięki czemu treść błędu zawiera kontekst.

use thiserror::Error;

#[derive(Error, Debug)]
pub enum ConfigError {
    #[error("missing key: {key}")]
    Missing { key: String },
    #[error("value {0} out of range")]
    OutOfRange(i32),
}

Automatyczne implementacje Display i Error

Makro derive automatycznie implementuje zarówno Display (na podstawie podanych komunikatów), jak i std::error::Error. Nie trzeba pisać ręcznie bloków impl.

Opakowywanie błędu źródłowego

#[from] generuje implementację From, dzięki czemu operator ? może przekonwertować błąd bazowy na Pana/Pani typ. #[source] oznacza przyczynę błędu.

use thiserror::Error;

#[derive(Error, Debug)]
pub enum AppError {
    #[error("io failure")]
    Io(#[from] std::io::Error),
    #[error("parse failure")]
    Parse(#[from] std::num::ParseIntError),
}

Używanie operatora ?

Dzięki #[from] operator ? automatycznie konwertuje standardowe błędy na AppError.

fn read_number(path: &str) -> Result<i32, AppError> {
    let text = std::fs::read_to_string(path)?; // io::Error -> AppError
    let n: i32 = text.trim().parse()?;          // ParseIntError -> AppError
    Ok(n)
}

Łańcuch źródłowy

Po opakowaniu błędu crate thiserror udostępnia jego przyczynę za pośrednictwem Error::source, umożliwiając tworzenie pełnych łańcuchów błędów na potrzeby logowania i debugowania.

Błędy transparentne

#[error(transparent)] przekazuje zarówno Display, jak i źródło do opakowanego błędu. Jest to przydatne w przypadku wariantu przekazującego błąd bez zmian.

use thiserror::Error;

#[derive(Error, Debug)]
pub enum WrapError {
    #[error(transparent)]
    Other(#[from] std::io::Error),
}

Kiedy używać thiserror

Warto użyć thiserror, gdy:

  • tworzy Pan/Pani bibliotekę
  • kod wywołujący musi dopasowywać konkretne warianty błędów
  • potrzebuje Pan/Pani stabilnego, typowanego API błędów

W aplikacjach, w których wystarczy przekazywanie błędów wyżej, crate anyhow jest często prostszy.

Dopasowywanie wariantów

Ponieważ błąd jest rzeczywistym enumem, kod wywołujący może użyć match, aby różnie reagować na poszczególne rodzaje niepowodzeń.

fn handle(err: AppError) {
    match err {
        AppError::Io(_) => println!("retry the file operation"),
        AppError::Parse(_) => println!("ask the user to fix input"),
    }
}

Szybkie sprawdzenie

Co generuje atrybut #[from] w enumie thiserror?

Podsumowanie

Poznał(a) Pan/Pani crate thiserror:

  • #[derive(Error)] generuje implementacje Display i Error
  • #[error("...")] definiuje komunikaty z interpolacją pól
  • #[from] umożliwia konwersję błędów źródłowych za pomocą ?
  • transparent przekazuje błąd do opakowanego błędu
  • Jest idealny do typowanych API błędów w bibliotekach

Często zadawane pytania

Czy lekcja „thiserror” jest bezpłatna?

Tak — pełny tekst „thiserror” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Learn Rust Coding, przejdź na CoddyKit PRO. Kurs Learn Rust Coding zawiera 4 lekcji w sumie.

Co nauczysz się w „thiserror”?

Niestandardowe typy błędów Ćwiczysz Learn Rust Coding z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Learn Rust Coding?

Nie wymagamy żadnego doświadczenia. Learn Rust Coding w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „thiserror”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Learn Rust Coding?

Tak. Każda lekcja Learn Rust Coding zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Result i operator ?
  2. thiserror
  3. anyhow
  4. Konwersja błędów
← Powrót do Learn Rust Coding