Welcome to Our Website

Custom virheet, ulottuu Virhe

Kun kehitämme jotain, me usein tarve oma virhe luokat vastaamaan erityisiä asioita, jotka voivat mennä pieleen meidän tehtäviä. Virheet verkkotoiminnan saatamme tarvita HttpError, tietokannan toiminnan DbError, etsivät toiminta NotFoundError ja niin edelleen.

– Meidän virheitä tulee tukea perus virhe ominaisuuksia, kuten message, name ja mieluiten stack. Mutta niillä voi olla myös muita omia ominaisuuksia, esim., HttpError esineet voi olla statusCode omaisuuden arvo, kuten 404 tai 403 tai 500.

JavaScript mahdollistaa käyttää throw tahansa väite, joten teknisesti meidän mukautettu virhe-luokkia ei tarvitse periä Error. Mutta jos me perimme, niin tulee mahdolliseksi käyttää obj instanceof Error error objects tunnistamiseen. Joten on parempi periä se.

sovelluksen kasvaessa omat virheet muodostavat luonnollisesti hierarkian., Esimerkiksi HttpTimeoutError voi periä HttpError, ja niin edelleen.

Jatkamisesta Virhe

esimerkkinä, katsotaanpa harkita toiminto readUser(json) että pitäisi lukea JSON-käyttäjän tiedot.

Tässä on esimerkki siitä, miten voimassa json saattaa näyttää:

let json = `{ "name": "John", "age": 30 }`;

Sisäisesti, käytämme JSON.parse. Jos se saa epämuodostunut json, niin se heittää SyntaxError., Mutta vaikka json on syntaktisesti oikea, se ei tarkoita, että se olisi kelvollinen käyttäjä, eikö? Se voi menettää tarvittavat tiedot. Esimerkiksi, se voi olla name ja age ominaisuuksia, jotka ovat välttämättömiä käyttäjille.

toiminta readUser(json) ei vain lukea JSON, mutta tarkista (”vahvista”) tiedot. Jos ei ole vaadittuja kenttiä tai formaatti on väärä, niin se on virhe. Eikä se ole SyntaxError, koska tieto on syntaktisesti oikea, mutta toisenlainen virhe., Kutsumme sitä ValidationError ja luomme sille luokan. Tämänkaltaisessa virheessä pitäisi olla myös tietoa loukkaavasta kentästä.

Meidän ValidationError luokan tulee periä sisäänrakennettu Error luokka.

Tämä luokka on sisäänrakennettu, mutta tässä on sen arvioitu koodi, jotta voimme ymmärtää, mitä olemme jatkamisesta:

Nyt periä ValidationError alkaen se ja kokeilla sitä toiminnassa:

huom: rivi (1) kutsumme vanhemman rakentaja., JavaScript vaatii meitä soittaa super lapsen rakentaja, joten se on pakollinen. Emokonstruktori asettaa message omaisuuden.

vanhemman rakentaja asettaa myös name omaisuutta "Error", niin rivi (2) palauttaa sen oikeaan arvoon.,

yritetään käyttää se readUser(json):

try..catch lohko yllä oleva koodi käsittelee sekä meidän ValidationError sisäinen SyntaxError alkaen JSON.parse.

ole hyvä ja vilkaise, miten käytämme instanceof tarkistaa erityisiä virheen tyyppi ja rivi (*).,

voisimme myös katsoa err.name näin:

// ...// instead of (err instanceof SyntaxError)} else if (err.name == "SyntaxError") { // (*)// ...

instanceof versio on paljon parempi, koska tulevaisuudessa aiomme laajentaa ValidationError, tehdä alatyyppejä, kuten PropertyRequiredError. Ja instanceof tarkista, jatkaa työtä uusien perii luokat. Se on siis tulevaisuudenkestävää.

Myös se on tärkeää, että jos catch täyttää tuntematon virhe, niin se rethrows se rivi (**)., catch lohko vain tietää, miten käsitellä validointi ja syntaksi virheet, muunlaisia (koska typo koodissa tai muita tuntemattomia niistä) pitäisi pudota kautta.

Edelleen perintö

ValidationError luokka on hyvin yleinen. Moni asia voi mennä pieleen. Omaisuus voi olla poissa tai se voi olla väärässä muodossa (kuten string-arvo age). Tehdään konkreettisempi Luokka PropertyRequiredError, tarkalleen puuttuvien ominaisuuksien osalta. Siinä on lisätietoa kadonneesta omaisuudesta.,

uusi PropertyRequiredError on helppo käyttää: meidän tarvitsee vain siirtää kiinteistön nimi: new PropertyRequiredError(property). Ihmisen luettavassa message syntyy rakentaja.

huomaa, että this.name vuonna PropertyRequiredError rakentajan on taas määritetty manuaalisesti. Siitä voi tulla hieman ikävä-määrittää this.name = <class name> jokaisessa mukautetussa virheluokassa. Voimme välttää sen tekemällä oman ”BASIC error” – luokan, joka määrittää this.name = this.constructor.name. Ja sitten periä kaikki meidän custom virheitä siitä.,

kutsutaan sitä MyError.

Tässä on koodi MyError ja muita mukautettuja virhe luokat, yksinkertaistettu:

Nyt custom virheet ovat paljon lyhyempiä, erityisesti ValidationError, niin pääsimme eroon "this.name = ..." linjan rakentaja.

Kääriminen poikkeukset

tarkoitus toiminto readUser yllä olevassa koodissa on ”lue käyttäjän tietoja”. Prosessissa voi esiintyä erilaisia virheitä., Nyt olemme SyntaxError ja ValidationError, mutta tulevaisuudessa readUser toiminto voi kasvaa, ja todennäköisesti tuottaa muita virheitä.

koodia, joka kutsuu readUser pitäisi käsitellä nämä virheet. Nyt se käyttää useita ifs catch lohko, tarkista, että luokan ja käsitellä tunnettuja virheitä ja rethrow tuntematon niistä.

järjestelmä on tällainen:

yllä olevassa koodissa näemme kahdenlaisia virheitä, mutta niitä voi olla enemmänkin.,

– Jos readUser toiminto tuottaa useita erilaisia virheitä, meidän tulisi kysyä itseltämme: haluammeko tarkistaa kaikki virhe tyypit yksi kerrallaan joka kerta?

Usein vastaus on ”Ei”: haluaisimme olla ”yksi taso ennen kaikkea, että”. Haluamme vain tietää, oliko ”tietojen lukuvirhe” – miksi juuri se tapahtui on usein epäolennaista (virheviesti kuvaa sitä). Tai vielä parempi, haluaisimme saada virhetiedot, mutta vain jos on pakko.

tässä kuvattua tekniikkaa kutsutaan ”paketointipoikkeuksiksi”.,

  1. tehdään uusi luokka ReadError edustaa geneerinen ”tietojen lukeminen” – virheen.
  2. toiminto readUser saalis tietojen käsittelyssä virheitä, jotka tapahtuvat sen sisällä, esimerkiksi ValidationError ja SyntaxError, ja luo ReadError sijaan.
  3. ReadError objekti säilyttää viittaus alkuperäiseen virhe sen cause omaisuutta.,

Sitten koodi, joka kutsuu readUser tarvitsee vain tarkistaa ReadError, ei kaikenlaista tietojen lukeminen virheitä. Ja jos se tarvitsee lisätietoja virheestä, se voi tarkistaa sen cause omaisuuden.,

Tässä on koodi, joka määrittelee ReadError ja osoittaa sen käyttö readUser ja try..catch:

yllä oleva koodi, readUser toimii juuri kuvatulla – saaliit syntaksi ja validointi virheitä ja heittoja ReadError virheitä sijaan (tuntematon virheet ovat rethrown kuten tavallista).

joten ulkokooditarkistukset instanceof ReadError ja se siitä. Ei tarvitse luetella kaikkia mahdollisia virhetyyppejä.,

lähestymistapa on nimeltään ”kääre poikkeuksia”, koska otamme ”alhainen taso” poikkeuksia ja ”kääri” ne ReadError joka on enemmän abstrakti. Sitä käytetään laajasti oliopainotteisessa ohjelmoinnissa.

Tiivistelmä

  • Voimme periä Error ja muut sisäänrakennettu virhe luokat normaalisti. Meidän täytyy vain huolehtia name omaisuutta ja älä unohda soittaa super.
  • voidaan käyttää instanceof tarkistaa erityistä virheitä. Se toimii myös perinnön kanssa., Mutta joskus meillä on virheobjekti tulossa 3rd-puolueen kirjastosta, eikä ole helppoa tapaa saada luokkaansa. Silloin name omaisuutta voidaan käyttää tällaisiin tarkastuksiin.
  • Paketointipoikkeukset ovat yleinen tekniikka: funktio käsittelee matalan tason poikkeuksia ja luo korkeamman tason virheitä erilaisten matalan tason poikkeusten sijaan. Matalan tason poikkeuksia joskus tullut ominaisuuksia, joita esineellä, kuten err.cause esimerkkejä edellä, mutta se ei ole ehdottomasti tarpeen.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *