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 if
s 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”.,
- tehdään uusi luokka
ReadError
edustaa geneerinen ”tietojen lukeminen” – virheen. - toiminto
readUser
saalis tietojen käsittelyssä virheitä, jotka tapahtuvat sen sisällä, esimerkiksiValidationError
jaSyntaxError
, ja luoReadError
sijaan. -
ReadError
objekti säilyttää viittaus alkuperäiseen virhe sencause
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 huolehtianame
omaisuutta ja älä unohda soittaasuper
. - 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. Silloinname
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.