Rust-ohjelmoinnin perusteet · Oppitunti

thiserror

Mukautetut virhetyypit.

Oppitunti 2/413 vaihetta

thiserror on ilmainen Rust-ohjelmoinnin perusteet-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Rust-ohjelmoinnin perusteet-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Rust-ohjelmoinnin perusteet-kurssilla on yhteensä 4 oppituntia.

Miksi mukautettuja virheitä?

Kirjastojen kannattaa tarjota merkityksellisiä virhetyyppejä, jotta kutsuva koodi voi reagoida tiettyihin virhetilanteisiin. Niiden kirjoittaminen käsin tarkoittaa paljon toisteista koodia. thiserror-cratella voitte luoda sen automaattisesti.

thiserrorin lisääminen

Lisätkää se riippuvuudeksi. Se on derive-makroja tarjoava crate, jonka käytöstä ei aiheudu ajonaikaisia kustannuksia.

[dependencies]
thiserror = "1.0"

Virheen määrittäminen enumina

Derivoikaa Error enumille, jossa jokainen variantti edustaa erillistä virhetilannetta. #[error("...")]-attribuutti määrittää Display-viestin.

use thiserror::Error;

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

Kenttien interpolointi

Viestimerkkijonossa voidaan viitata nimettyihin tai järjestysnumeroilla määritettyihin kenttiin, joten virheteksti voi sisältää tilanteen kannalta olennaista tietoa.

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 ja Error automaattisesti

Derivointi toteuttaa automaattisesti sekä Display-traitin (viestienne perusteella) että std::error::Error-traitin. Manuaalisia impl-lohkoja ei tarvita.

Lähdevirheen kääriminen

#[from] luo From-impl-toteutuksen, jonka ansiosta ?-operaattori voi muuntaa taustalla olevan virheen omaksi virhetyypiksenne. #[source] merkitsee virheen aiheuttajan.

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

Käyttö ?-operaattorin kanssa

#[from]-attribuutin ansiosta ?-operaattori muuntaa standardivirheet automaattisesti AppError-tyypiksi.

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

source-ketju

Kun käärätte virheen, thiserror tarjoaa aiheuttajan Error::source-funktion kautta, mikä mahdollistaa täydelliset virheketjut lokitusta ja vianmääritystä varten.

Transparent-virheet

#[error(transparent)] välittää sekä Display-esityksen että lähdevirheen kääritylle virheelle. Tämä on hyödyllistä läpivientivariantissa.

use thiserror::Error;

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

Milloin thiserroria kannattaa käyttää

Valitkaa thiserror, kun:

  • kirjoitatte kirjastoa
  • kutsujien on voitava tehdä match tiettyihin virhevariantteihin
  • haluatte vakaan ja tyypitetyn virhe-API:n

Sovelluksissa, joissa haluatte vain välittää virheet eteenpäin, anyhow on usein yksinkertaisempi vaihtoehto.

Varianttien käsittely matchilla

Koska virhe on todellinen enum, kutsuva koodi voi käyttää siihen match-rakennetta ja reagoida eri tavoin kuhunkin virhetyyppiin.

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

Pikatarkistus

Mitä #[from]-attribuutti luo thiserror-enumissa?

Kertaus

Opitte thiserror-craten käytön:

  • #[derive(Error)] luo Display- ja Error-impl-toteutukset
  • #[error("...")] määrittää viestit kenttien interpoloinnilla
  • #[from] mahdollistaa lähdevirheiden muuntamisen ?-operaattorilla
  • transparent välittää käsittelyn kääritylle virheelle
  • Sopii erityisesti tyypitettyihin kirjastojen virhe-API:eihin
Aloita maksutta

Opi Rust tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
39
Oppitunnit
144

Usein kysytyt kysymykset

Onko oppitunti ”thiserror” ilmainen?

Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Rust-ohjelmoinnin perusteet-oppimispolun 3 oppituntia, myös oppitunnin “thiserror”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Rust-ohjelmoinnin perusteet-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”thiserror”?

Mukautetut virhetyypit. Harjoittelet Rust-ohjelmoinnin perusteet-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Rust-ohjelmoinnin perusteet-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Rust-ohjelmoinnin perusteet-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”thiserror”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Rust-ohjelmoinnin perusteet-oppitunnilla?

Kyllä. Jokainen Rust-ohjelmoinnin perusteet-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Result ja ?-operaattori
  2. thiserror
  3. anyhow
  4. Virheiden muuntaminen
← Takaisin: Rust-ohjelmoinnin perusteet