JavaScript suportă try/catch/finally
dar de Eroare obiect se folosește funcționează diferit de Excepții în alte limbi și nu oferă o modalitate de a prinde Erori de tip în același mod în care puteți cu Excepții în Java sau C#, deci este destul de comun pentru toate Erorile aruncat într-un proiect pentru a fi cazuri de Eroare.unii furnizori au implementat o clauză de captură condiționată, dar aceasta nu este un standard și nu este acceptată pe scară largă în browsere.,
Ca un rezultat de a nu avea o modalitate standard de a defini erori — sau să-i întoarcă atunci când aruncându-le de la un server de la un client — informații despre o eroare a fost returnat este de multe ori pierdut, cu proiecte cu comanda eroare de manipulare.
aruncarea erorilor în alte limbi
Dacă ați folosit vreodată. net / Mono, este posibil să apreciați cât de bun este comportamentul de gestionare a erorilor, în special pentru serviciile web.
dacă nu sunteți familiarizat cu stiva. net / Mono goale cu mine aici pentru un minut, vom reveni la modul în care este relevant mai jos.
convenții de denumire
.,NET are convenții de denumire pentru erori, cum ar fi InputValidationException
pentru intrare erori de validare și SecurityException
permisiuni erori, care este mare pentru încurajarea consecvență în eroare de manipulare.o altă caracteristică excelentă a. NET este că aruncarea unei excepții pe server într — un serviciu web poate arunca automat acea excepție într-un client folosind serviciul-indiferent dacă Clientul este C#, Java, PHP sau JavaScript.,acest lucru este posibil datorită limbajului de descriere a serviciilor Web (WSDL), care definește modul în care obiectele, inclusiv excepțiile, sunt serializate și are suport nativ în unele limbi (inclusiv C# și PHP) și suport prin biblioteci terțe în altele (inclusiv Java și JavaScript).ce este atât de mare despre a avea convenții pentru erori este face mai ușor să se ocupe de erori specifice bine, deoarece acestea au tipuri explicite și coerente.,
cu tipuri de erori predefinite puteți decide cu ușurință cât de multe detalii doriți să reveniți la client (cum ar fi numele câmpurilor care nu au reușit validarea și ce a fost în neregulă cu acestea) în timp ce înregistrați informații suplimentare de urmărire a stivei pe server atunci când sunt declanșate erori neașteptate.
de asemenea, puteți adăuga proprietăți specifice la o eroare, pentru a evidenția mai ușor unde se află o problemă — cum ar fi un câmp de introducere cu o valoare nevalidă.
serializarea este automată și consecventă într-o aplicație, inclusiv între clienți și servere., Acest lucru face mai ușor să se ocupe de erori bine partea de server și într-o interfață de utilizator.
definirea tipurilor de erori în JavaScript
JavaScript are de fapt mai multe tipuri de erori de bază în mod implicit, dar sunt destul de nișă și de utilitate limitată pentru manipularea erorilor în majoritatea aplicațiilor.cu toate acestea, cu ES6 puteți extinde clasa de eroare și defini Erorile personalizate cu propriul comportament — cum ar fi erorile de logare în mod automat – și puteți alege ce detaliu să adăugați sau să includeți atunci când returnați o eroare.,
puteți defini fiecare clasă într – un fișier sau – dacă aveți doar un număr mic de tipuri de erori, ceea ce este probabil cazul pentru majoritatea proiectelor-le puteți defini pe toate într-un singur fișier ca exporturi numite.
un exemplu de exportare a diferitelor tipuri de erori ca exporturi numite:
puteți utiliza erori personalizate în codul dvs. la fel cum ați face o eroare normală:
Notă: Acest exemplu este pentru nod.js și utilizează „necesită”., Dacă ați scris-o pentru ES6 în browser (sau folosind Babel pentru cod izomorf), ați scrie declarația include ca import { ValidationError } from './error'
când aruncați o eroare personalizată, puteți verifica ce tip este (de ex., uitandu-se la valoarea de .name
) și să decidă cum să-l ocupe în mod corespunzător:
Definirea unui name
proprietate, un standard proprietate de Eroare de clasă în JavaScript, oferă o modalitate de a verifica cu ușurință tipul de Eroare dacă este serializat într-un standard de obiect într-un azil de apel sau într-o priză serviciu de apel invers, astfel încât să puteți arunca Eroarea tot stack—de exemplu de la o metoda internă, web server traseu handler și tot drumul la un browser —ul și încă mai știu ce s-a întâmplat.,
Dacă returnați o eroare de la un serviciu bazat pe REST sau socket, eroarea va fi de obicei serializată în JSON și back și este probabil să fie transformată într-un obiect simplu (și nu mai este un obiect de eroare) până când clientul evaluează răspunsul, dar definirea tipurilor de erori ca aceasta în proiectele dvs. poate ajuta în continuare să oferiți o convenție pentru returnarea și verificarea erorilor.
returnarea obiectelor de eroare din promisiuni
puteți utiliza obiecte de eroare personalizate și în interiorul unei promisiuni.,cel mai bine este să evitați aruncarea erorilor din interiorul unei promisiuni, deoarece acestea nu pot fi întotdeauna prinse, în funcție de modul în care este structurat codul care le-a numit.cu toate acestea, este o practică bună să returnați o eroare atunci când respingeți o promisiune și puteți returna tipuri de erori personalizate la fel ca orice altă eroare.
când apelați funcția, clauza catch()
poate verifica apoi răspunsul la returnarea unei erori. Dacă returnați o instanță de eroare (sau o clasă care o extinde), veți avea o urmărire completă a stivei erorii aruncate.,
orice cod care utilizează deja această funcție și care se aștepta la un obiect de eroare va fi compatibil cu o eroare personalizată care extinde clasa de eroare implicită.
Serializarea Eroare obiecte în JSON
în mod implicit, Eroare obiecte seralize la JSON cu ieșire de genul asta:
{ name: 'ValidationError' }
Această ieșire nu este deosebit de util dacă doriți pentru a trece erori înapoi direct la un web front-end de la un cadru cum ar fi Expres sau Soclu.IO.,
puteți suprascrie metoda de serializare pentru a returna un răspuns diferit:
Acest exemplu returnează răspunsul încapsulat într-o proprietate numită „eroare”, făcând mai ușor verificarea în răspunsuri. Se seralizes la JSON ca aceasta:
{
error: {
name: 'ValidationError',
message: 'A validation error',
stacktrace: '…'
}
}
Dacă aveți mai multe tipuri de erori, s-ar putea să doriți să creați propriul dvs. personalizat de eroare de clasă, care se extinde de Eroare și apoi baza tuturor eroare clase pe care.,
utilizarea codurilor de stare HTTP este adecvată pentru serviciile HTTP, dar a avea un format standard pentru erori în JSON este încă util – mai ales în alte contexte, cum ar fi răspunsurile trimise printr-o conexiune socket.
este posibil să nu doriți să includeți o urmărire stivă (cu nume de fișiere și numere de linie) în producție, dar poate fi utilă în dezvoltare și testare și puteți utiliza o condiție, astfel încât acestea să fie returnate doar în dezvoltare.,
Sumar
a Lua un sfat de la cât de Eroare de manipulare funcționează în alte limbi, cum ar fi Java și C# și definirea personalizate Erori cu metode standard pentru seralizing ele necesită nu necesită mult cod pentru a pune în aplicare și oferă un consistent și ușor de înțeles convenție să urmeze.
stabilirea unor convenții bune de gestionare a erorilor într-un proiect poate face mai ușor pentru a îmbunătăți experiența utilizatorului de software-ul dvs., suc de fructe mesaje misterioase „eroare necunoscută”, urmări în jos cauzele comportamentului neașteptat și face mai ușor pentru a vă conecta, monitoriza și raporta erorile.