Javascript ’ s built in Error
tarjoaa hyödyllistä tietoa,mutta voi usein tuntua epäselvältä. One-size-fits-all sopii hyvin kieleen, mutta pystymme paremmin omissa sovelluksissamme. Siinä omat virheet tulevat vastaan.
olet saattanut nähdä mukautettuja virheitä käytettäessä solmua.js. Solmu rakentuu virhetyypeistä kuten AssertionError
, RangeError
, ReferenceError
, SyntaxError
, ja SystemError
ovat kaikki native Error
– luokan laajennuksia.
Error
käyttäminen pohjana antaa kaiken JavaScriptin toteutuksen tehon sekä lisäetuja. Tässä vain muutama:
- mukautettuja virheilmoitusmuotoja.
- lisäominaisuuksia Virhekohteessa.
- nimetyt virheet helpottamaan virheenkorjausta ja ehdollista virheiden käsittelyä.
- johdonmukaiset virheet kirjaston kuluttajille viitteeksi.
laajennetaan Virheluokkaa
, jotta päästään alkuun, käytetään yleisesimerkkiä. Laajennamme Error
– luokkaa ja käytämme super
perimään sen funktiot.
class CustomError extends Error { constructor(...params) { super(...params) // We're spreading `params` as a way to bring all of `Error`'s functionality in. }}
nyt, kun throw
virhe, voit tehdä sen throw new CustomError("Something went wrong...")
. Se antaa myös mahdollisuuden tarkistaa virheet tyyppiä vastaan:
try { throw new CustomError("Something went wrong")} catch (error) { if (error instance of CustomError) { // do something specifically for that type of error }}
tämä yksin ei paljoa auta, muuta kuin antaa uuden virhetyypin soitettavaksi ja tarkistettavaksi. Jotta ymmärtäisimme paremmin, mitä voidaan tehdä, katsotaan, mitä tulee standardiin Error
.
- Error.name
- Virhe.viesti
- virhe.prototyyppi.toString ()
- virhe.prototyyppi.constructor()
ei paljon työtä, vai mitä? Konstruktorin ja toString
– menetelmän lisäksi virheen nimi ja virhettä kuvaava viesti ovat ainoat osat, joita todennäköisesti käytämme. Yllä olevassa esimerkissä message
asetetaan lausumalla” jokin meni pieleen ” argumentiksi, kun instantioidaan virhettä.
onneksi useimmat javascript-alustat kuten selain ja Solmu.js on lisännyt omia menetelmiään ja ominaisuuksiaan listattujen päälle. Keskitymme muutamiin näkökohtiin V8: n Virhetäytäntöönpanosta, Javascript-moottorista, joka virittää kromia ja solmua.js.
kaksi kiinnostavinta aluetta ovat stack
ja captureStackTrace
. Kuten heidän nimensä viittaavat, ne mahdollistavat pinon jäljityksen. Katsotaan, miltä se näyttää esimerkin avulla.
class CustomError extends Error { constructor(...args) { super(...args) if (Error.captureStackTrace) { Error.captureStackTrace(this, CustomError) } this.name = "Our Custom Error" }}try { throw new CustomError("Something went wrong")} catch (err) { console.error(err.stack)}
tässä esimerkissä kutsumme Error.captureStackTrace
, jos alusta tukee sitä, varmistaaksemme, että mukautettuun virheeseemme lisätään täydellinen jälki. Sitten throw
virhe try
lohkon sisältä, joka siirtää kontrollin catch
lohkolle.
jos ajaa yllä olevan koodin, huomaa, että stack
ensimmäinen rivi on virheen name
ja message
.
Our Custom Error: Something went wrong
tämä virhe ei ole kovin ”syvä”, joten pino on lähinnä solmu.js sisäelimet. Jokainen rivi on yksi” runko ” pinosta. Ne sisältävät yksityiskohtaiset tiedot virheen sijainnista koodirivistössä.
nyt kun osaamme tehdä ja soittaa mukautetun virheen, tehdään siitä hyödyllinen.
muokatun Virhesisällön
mukautettu virhe, jonka kanssa olemme työskennelleet, on hieno, mutta muutetaan sitä, jotta siitä olisi enemmän hyötyä. Luokka on CircuitError
. Käytämme sitä tarjoamaan mukautettuja virheitä, jotka tulevat katkaisijasta. Jos et tunne kuviota, se on OK. Katkaisijan toteutustiedot eivät ole tärkeitä. Tärkeää on, että voimme välittää joitakin tietoja virheeseen, ja se esittää nämä tiedot käyttäjälle.
murtajalla on ”avoin” tila, joka ei salli minkään kulkea sen läpi tietyn ajan. Asetetaanpa CircuitError
niin, että se sisältää joitakin yksityiskohtia, jotka voisivat olla hyödyllisiä funktioille, jotka saavat sen, kun tila on OPEN
.
class CircuitError extends Error { // 1 constructor(state, nextAttempt, ...params) { super(...params) if (Error.captureStackTrace) { Error.captureStackTrace(this, CircuitError) } this.name = "CircuitError" this.state = state // 2 this.message = `The Circuit is ${state}.` // 3 if (nextAttempt) { this.timestamp = Date.now() this.nextAttempt = nextAttempt this.message += ` Next attempt can be made in ${this.nextAttempt - this.timestamp}ms.` } }}
meidän päivitetty virhe tekee muutamia uusia asioita, kaikki rakentajan sisällä. Hyväksytyt argumentit ovat muuttuneet (1) siten, että ne sisältävät katkaisijan state
sekä nextAttempt
aikaleiman, joka osoittaa, milloin katkaisija alkaa yrittää pyyntöjä uudelleen.
sen jälkeen se asettaa muutamia uusia ominaisuuksia ja päivittää sanomaa esitettyjen arvojen mukaan. Voimme testata sitä heittämällä uuden version tästä virheestä.
try { throw new CircuitError("OPEN", Date.now() + 8000)} catch (err) { console.error(err)}
nyt kun heitämme virheen, se ottaa tilan ensimmäiseksi argumentiksi ja aikaleiman toiseksi. Tällä demolla kuljemme ajassa 8000 millisekuntia tulevaisuudessa. Huomaa, että olemme myös kirjaamalla virhe itse, eikä vain pino.
koodin juokseminen johtaa muun muassa seuraaviin:
CircuitError : The Circuit is OPEN. Next attempt can be made in 6000ms. at Object.<anonymous> (/example.js:21:9) at Module._compile (internal/modules/cjs/loader.js:1063:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:1103:10) at Module.load (internal/modules/cjs/loader.js:914:32) at Function.Module._load (internal/modules/cjs/loader.js:822:14) at Function.Module.runMain (internal/modules/cjs/loader.js:1143:12) at internal/main/run_main_module.js:16:11 { name: 'Circuit Error', state: 'OPEN', message: 'The Circuit is OPEN. Next attempt can be made in 6000ms.', timestamp: 1580242308919, nextAttempt: 1580242314919}
tuloksena on virhenimi, jota seuraa ensimmäisellä rivillä oleva viesti. Sitten meillä on loput pinosta, jota seuraa kaikki CircuitError
asettamamme ominaisuudet. Tämän virheen kuluttajat voisivat käyttää näitä tietoja reagoidakseen virheeseen. Esimerkiksi:
try { throw new CircuitError("OPEN", Date.now() + 8000)} catch (err) { customLogger(err) if (err.state === "OPEN") { handleOpenState(err.nextAttempt) }}
yleisen virheen sijaan meillä on nyt jotain paremmin sovelluksemme tarpeisiin sopivaa.
vikoihin reagoiminen
mukautetut virheet ovat hyvä tapa reagoida vikoihin. On tavallista olettaa, että kaikki virheet ovat odottamattomia, mutta tarjoamalla hyödyllisiä virheitä voit tehdä niiden olemassaolon helpompi käsitellä. Käyttämällä mukautettuja virheitä voimme paitsi antaa sovellustemme käyttäjille arvokasta tietoa, myös esittää kyvyn reagoida virhetyyppeihin instance of
ehdon kautta.
Bearer – palvelussa käytämme mukautettuja virheitä standardoidaksemme vastauksia koodiimme, antaaksemme juuri tarvitsemasi tiedot asiakkaallemme ja tehdäksemme virheistämme toimintakelpoisia.
miten käytät mukautettuja virheitä sovelluksissasi? Ota meihin yhteyttä @BearerSH ja kerro meille.