Erorile și erorile sunt inevitabile în programare. Un prieten de-al meu îi sună caracteristici necunoscute :).

Spuneți-le cum doriți, dar sincer cred că bug-urile sunt unul dintre lucrurile care fac ca munca noastră de programatori să fie interesantă.

Adică, oricât de frustrat ai încerca să depanezi ceva cod peste noapte, sunt destul de sigur că vei râde bine când vei afla că problema a fost o simplă virgulă pe care ai trecut cu vederea, sau ceva de genul acesta. Deși, o eroare raportată de un client va aduce mai mult o încruntare decât un zâmbet.

Acestea fiind spuse, erorile pot fi enervante și o durere reală în spate. De aceea, în acest articol, vreau să explic ceva numit încearcă să prinzi în JavaScript.

Ce este un bloc try / catch în JavaScript?

A încearcă să prinzi blocul este practic utilizat pentru a gestiona erorile din JavaScript. Utilizați acest lucru atunci când nu doriți ca o eroare din script să vă rupă codul.

ad-banner

Deși acest lucru ar putea arăta ca ceva ce puteți face cu ușurință cu un afirmatie if, try / catch vă oferă o mulțime de beneficii dincolo de ceea ce poate face o declarație if / else, dintre care unele le veți vedea mai jos.

try{
//...
}catch(e){
//...
}

O declarație try vă permite să testați un bloc de cod pentru erori.

O declarație catch vă permite să gestionați acea eroare. De exemplu:

try{ 
getData() // getData is not defined 
}catch(e){
alert(e)
}

Acesta este practic modul în care este construit un try / catch. Vă introduceți codul în încercați să blocați, și imediat dacă există o eroare, JavaScript oferă fișierul captură controlul declarațiilor și face tot ce spui. În acest caz, vă avertizează asupra erorii.

Toate erorile JavaScript sunt de fapt obiecte care conțin două proprietăți: numele (de exemplu, Error, syntaxError și așa mai departe) și mesajul de eroare real. De aceea, când alertăm e, primim ceva de genul ReferenceError: getData nu este definită.

La fel ca orice alt obiect din JavaScript, puteți decide să accesați valorile în mod diferit, de exemplu e.name(ReferenceError) și e.message(getData nu este definită).

Dar sincer acest lucru nu este cu adevărat diferit de ceea ce va face JavaScript. Deși JavaScript vă va respecta suficient pentru a înregistra eroarea în consolă și pentru a nu afișa alerta pentru ca lumea să o vadă :).

Atunci, care este beneficiul declarațiilor try / catch?

Cum se utilizează declarațiile try / catch

throw Afirmație

Unul dintre avantajele try / catch este capacitatea sa de a afișa propria eroare personalizată. Aceasta se numește (throw error).

În situațiile în care nu doriți acest lucru urât pe care îl afișează JavaScript, vă puteți arunca eroarea (o excepție) cu ajutorul fișierului declarație aruncă. Această eroare poate fi un șir, boolean sau obiect. Și dacă există o eroare, declarația catch va afișa eroarea pe care o aruncați.

let num =prompt("insert a number greater than 30 but less than 40")
try { 
if(isNaN(num)) throw "Not a number (☉。☉)!" 
else if (num>40) throw "Did you even read the instructions ಠ︵ಠ, less than 40"
else if (num <= 30) throw "Greater than 30 (ب_ب)" 
}catch(e){
alert(e) 
}

Este frumos, nu? Dar putem face un pas mai departe aruncând de fapt o eroare cu erorile constructorului JavaScript.

Practic JavaScript clasifică erorile în șase grupuri:

  • EvalError – A apărut o eroare în funcția eval.
  • RangeError – De exemplu, a apărut un număr în afara intervalului 1.toPrecision(500). toPrecision de fapt, dă numerelor o valoare zecimală, de exemplu 1.000, iar un număr nu poate avea 500 din aceasta.
  • ReferenceError – Utilizarea unei variabile care nu a fost declarată
  • eroare de sintaxă – Când evaluați un cod cu o eroare de sintaxă
  • Eroare de scris – Dacă utilizați o valoare care se află în afara intervalului de tipuri așteptate: de exemplu 1.toUpperCase()
  • Eroare URI (Uniform Resource Identifier) – O URIError este aruncată dacă utilizați caractere ilegale într-o funcție URI.

Deci, cu toate acestea, am putea arunca cu ușurință o eroare de genul throw new Error("Hi there"). În acest caz, numele erorii va fi Eroare și mesajul bună. Puteți chiar să continuați și să creați propriul dvs. constructor de erori personalizate, de exemplu:

function CustomError(message){ 
this.value ="customError";
this.message=message;
}

Și îl puteți folosi cu ușurință oriunde throw new CustomError("data is not defined").

Până acum am aflat despre try / catch și despre cum împiedică moartea scriptului nostru, dar asta depinde de fapt. Să luăm în considerare acest exemplu:

try{ 
console.log({{}}) 
}catch(e){ 
alert(e.message) 
} 
console.log("This should run after the logged details")

Dar când îl încercați, chiar și cu declarația try, tot nu funcționează. Acest lucru se datorează faptului că există două tipuri principale de erori în JavaScript (ceea ce am descris mai sus – syntaxError și așa mai departe – nu sunt într-adevăr tipuri de erori. Le puteți numi exemple de erori): erori de analiză în timp și erori sau excepții în timpul rulării.

Erori de analiză în timp sunt erori care apar în interiorul codului, practic deoarece motorul nu înțelege codul.

De exemplu, de sus, JavaScript nu înțelege la ce te referi {{}}și, din această cauză, try / catch nu are nici un folos aici (nu va funcționa).

Pe de altă parte, erori de rulare sunt erori care apar într-un cod valid, iar acestea sunt erorile pe care try / catch le vor găsi cu siguranță.

try{ 
y=x+7 
} catch(e){ 
alert("x is not defined")
} 
alert("No need to worry, try catch will handle this to prevent your code from breaking")

Credeți sau nu, cele de mai sus sunt coduri valabile și try / catch va gestiona eroarea în mod corespunzător.

Finally afirmație

in cele din urma declarația acționează ca teren neutru, punctul de bază sau terenul final pentru blocul dvs. de încercare / captură. În cele din urmă, practic spuneți indiferent ce se întâmplă în try / catch (eroare sau fără eroare), acest cod din instrucțiunea finală ar trebui să ruleze. De exemplu:

let data=prompt("name")
try{ 
if(data==="") throw new Error("data is empty") 
else alert(`Hi ${data} how do you do today`) 
} catch(e){ 
alert(e) 
} finally { 
alert("welcome to the try catch article")
}

Blocaje de încercare cuibărire

Puteți, de asemenea, să blocați blocuri de încercare, dar la fel ca orice alte cuiburi în JavaScript (de exemplu dacă, pentru și așa mai departe), tinde să devină stângaci și ilizibil, așa că vă sfătuiesc. Dar asta sunt doar eu.

Blocările de încercare cuibărire vă oferă avantajul de a utiliza o singură declarație de captură pentru mai multe instrucțiuni de încercare. Deși ați putea decide să scrieți o declarație de captură pentru fiecare bloc de încercare, astfel:

try { 
try { 
throw new Error('oops');
} catch(e){
console.log(e) 
} finally { 
console.log('finally'); 
} 
} catch (ex) { 
console.log('outer '+ex); 
}

În acest caz, nu va exista nicio eroare din blocul de încercare extern, deoarece nimic nu este în neregulă cu acesta. Eroarea provine din blocul de încercare interioară și deja are grijă de ea însăși (are propria declarație catch). Luați în considerare acest lucru mai jos:

try { 
try { 
throw new Error('inner catch error'); 
} finally {
console.log('finally'); 
} 
} catch (ex) { 
console.log(ex);
}

Acest cod de mai sus funcționează puțin diferit: eroarea apare în blocul de încercare interioară fără declarație catch, ci în schimb cu o instrucțiune finală.

Rețineți că încearcă să prinzi poate fi scris în trei moduri diferite: try...catch, try...finally, try...catch...finally), dar eroarea este aruncată din această încercare interioară.

Declarația finală pentru această încercare interioară va funcționa cu siguranță, deoarece așa cum am spus mai devreme, funcționează indiferent de ce se întâmplă în try / catch. Dar, deși încercarea externă nu are o eroare, controlul este dat încă capturii sale pentru a înregistra o eroare. Și chiar mai bine, folosește eroarea pe care am creat-o în instrucțiunea try interna, deoarece eroarea vine de acolo.

Dacă ar fi să creăm o eroare pentru încercarea exterioară, aceasta ar afișa totuși eroarea interioară creată, cu excepția că cea interioară își prinde propria eroare.

Puteți juca cu codul de mai jos comentând captura interioară.

try { 
try { 
throw new Error('inner catch error');
} catch(e){ //comment this catch out
console.log(e) 
} finally { 
console.log('finally'); 
} 
throw new Error("outer catch error") 
} catch (ex) { 
console.log(ex);
}

Eroarea retrasă

Declarația catch captează de fapt toate erorile care îi apar și uneori s-ar putea să nu ne dorim asta. De exemplu,

"use strict" 
let x=parseInt(prompt("input a number less than 5")) 
try{ 
y=x-10 
if(y>=5) throw new Error(" y is not less than 5") 
else alert(y) 
}catch(e){ 
alert(e) 
}

Să presupunem pentru o secundă că numărul introdus va fi mai mic de 5 (scopul “folosi strict” este să indice că codul trebuie executat în „mod strict”). Cu modul strict, nu puteți utiliza, de exemplu, variabile nedeclarate (sursă).

Vreau ca declarația try să arunce o eroare de nu e … când valoarea lui y este mai mare de 5 ceea ce este aproape imposibil. Eroarea de mai sus ar trebui să fie pentru y nu este mai puțin … si nu y este nedefinit.

În astfel de situații, puteți verifica numele erorii și, dacă nu este ceea ce doriți, retrageti-l:

"use strict" 
let x = parseInt(prompt("input a number less than 5"))
try{
y=x-10 
if(y>=5) throw new Error(" y is not less than 5") 
else alert(y) 
}catch(e){ 
if(e instanceof ReferenceError){ 
throw e
}else alert(e) 
} 

Acest lucru va fi pur și simplu retrageți eroarea pentru o altă declarație try pentru a prinde sau a sparge scriptul aici. Acest lucru este util atunci când doriți să monitorizați doar un anumit tip de eroare și alte erori care ar putea apărea ca urmare a neglijenței ar trebui să rupă codul.

Concluzie

În acest articol, am încercat să explic următoarele concepte legate de try / catch:

  • Ce sunt declarațiile try / catch și când funcționează
  • Cum să arunci erori personalizate
  • Ce este afirmația în cele din urmă și cum funcționează
  • Cum funcționează declarațiile Nest / try / catch
  • Cum se retrag erorile

Mulțumesc că ai citit. Urmăriți-mă pe twitter @fakoredeDami.