Learn Rust Coding · Lezione

thiserror

Tipi di errore personalizzati

Lezione 2 di 413 passaggi

thiserror è una lezione Learn Rust Coding gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Learn Rust Coding, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Learn Rust Coding include 4 lezioni in totale.

Perché usare errori personalizzati?

Le librerie dovrebbero esporre tipi di errore significativi, così i chiamanti possono reagire a fallimenti specifici. Scriverli manualmente comporta molto codice ripetitivo. Il crate thiserror lo genera automaticamente.

Aggiungere thiserror

Lo aggiunga come dipendenza. È un crate di derive macro senza costi a runtime.

[dependencies]
thiserror = "1.0"

Definire un enum di errore

Applichi il derive Error a un enum in cui ogni variante rappresenta un errore distinto. L'attributo #[error("...")] fornisce il messaggio Display.

use thiserror::Error;

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

Interpolare i campi

La stringa del messaggio può fare riferimento a campi con nome o posizionali, così il testo dell'errore contiene il contesto.

use thiserror::Error;

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

Display ed Error automatici

Il derive implementa automaticamente sia Display (a partire dai messaggi) sia std::error::Error. Non servono blocchi impl manuali.

Avvolgere un errore di origine

#[from] genera un'implementazione di From, consentendo all'operatore ? di convertire un errore sottostante nel proprio tipo. #[source] indica la causa.

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),
}

Usarlo con ?

Grazie a #[from], l'operatore ? converte automaticamente gli errori standard nel proprio 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)
}

La catena source

Quando avvolge un errore, thiserror espone la causa tramite Error::source, consentendo di creare catene complete di errori per logging e debug.

Errori transparent

#[error(transparent)] inoltra sia Display sia source all'errore avvolto, una soluzione utile per una variante pass-through.

use thiserror::Error;

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

Quando usare thiserror

Ricorra a thiserror quando:

  • sta scrivendo una libreria
  • chi chiama il codice deve poter usare match su varianti di errore specifiche
  • desidera un'API di errore tipizzata e stabile

Per le applicazioni in cui desidera semplicemente propagare gli errori, anyhow è spesso più semplice.

Usare il match sulle varianti

Poiché l'errore è un vero enum, chi chiama il codice può usare match per reagire in modo diverso a ogni tipo di errore.

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

Verifica rapida

Che cosa genera l'attributo #[from] in un enum di thiserror?

Riepilogo

Ha imparato a usare il crate thiserror:

  • #[derive(Error)] genera le implementazioni di Display ed Error
  • #[error("...")] definisce i messaggi con interpolazione dei campi
  • #[from] abilita la conversione con ? dagli errori origine
  • transparent inoltra a un errore racchiuso
  • È ideale per API di errore tipizzate nelle librerie
Gratis per iniziare

Impara Rust con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
39
Lezioni
144

Domande Frequenti

La lezione «thiserror» è gratuita?

Sì — il testo completo di «thiserror» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Learn Rust Coding, passa a CoddyKit PRO. Il corso Learn Rust Coding include 4 lezioni in totale.

Cosa imparerò in «thiserror»?

Tipi di errore personalizzati Eserciti Learn Rust Coding con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Learn Rust Coding?

Non è richiesta alcuna esperienza precedente. Learn Rust Coding su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «thiserror»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Learn Rust Coding?

Sì. Ogni lezione Learn Rust Coding include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Result e operatore ?
  2. thiserror
  3. anyhow
  4. Conversione degli errori
← Torna a Learn Rust Coding