Tecniche anti-silenziose JavaScript per indicare il fallimento
-
16-09-2020 - |
Domanda
Quale sarebbe un buon modo per segnalare errori in JavaScript invece di fare affidamento su null e indefiniti quando si verificano errori e una funzione non è in grado di procedere in avanti. Posso pensare a tre approcci:
- .
- non fare nulla
- Getta un'eccezione
- Assert
Ecco uno scenario di esempio semplice - una funzione che crede un account utente con l'importo passato. La funzione credit
fa parte di un oggetto Account
.
Ecco la soluzione ingenua.
function credit(amount) {
this.balance += amount;
}
.
Un problema importante con questo approccio non è valido i dati. Riteniamolo e usiamo un valore di ritorno per indicare che l'operazione non è riuscita.
function credit(amount) {
if(!isInt(amount)) {
return false;
}
this.balance += amount;
}
.
Questo è un miglioramento rispetto a quello precedente, ma il codice client dovrà controllare il valore di ritorno per garantire che l'operazione sia riuscita. Fare questo per fondamentalmente ogni metodo nel sistema può diventare ingombrante.
if(!johnDoe.credit(100)) {
// do some error handling here
}
.
Un terzo approccio, simile al secondo, è quello di dare un'eccezione. Dal momento che stiamo gettando l'eccezione noi stessi, potrebbe lanciare un tipo specifico di eccezione piuttosto che un generale.
function credit(amount) {
if(!isInt(amount)) {
throw new InvalidAmountError(amount);
}
this.balance += amount;
}
.
Un quarto approccio simile alla lancio delle eccezioni è utilizzare le asserzioni nel codice. Una cumbrienza rispetto all'approccio di cui sopra è che dal momento che l'asserzione è generica, perdiamo la capacità di lanciare eccezioni personalizzate. È ancora possibile passare l'oggetto di lanciare ogni chiamata di asserzione.
function credit(amount) {
assert(!isInt(amount), "Amount to credit is not an integer");
this.balance += amount;
}
.
Una funzione Global assert
è facile da scrivere e rende il codice un po 'più breve.
function assert(value, message) {
if(value !== true) {
throw new AssertionError(message);
}
}
function AssertionError(message) {
this.message = message;
}
AssertionError.prototype.toString = function() {
return 'AssertionError: ' + this.message;
}
.
Di questi approcci, quale sarebbe un buon modo per affrontare valori imprevisti e percorsi infelici. Ci sono altri approcci non menzionati qui che potrebbero essere utili?
Soluzione
Considerare un framework di registrazione lato client per segnalare errori, come Log4JS .Si possono registrare i messaggi (I.e., informazioni, debug, avvertire, errore) nel browser o persiste ai messaggi al server tramite Ajax, a seconda dell'applicazione.
Il sito LOG4JS fornisce anche un Elenco di altri framework di registrazione JavaScript .
.Un buon approccio, utilizzando il tuo esempio di eccezione personalizzato, sarebbe di gettare l'eccezione e registrare l'errore come si vede in forma.
Altri suggerimenti
.una mancanza rispetto a quanto sopra L'approccio è che dal momento che l'asserzione è generico, perdiamo la capacità di lanciare Eccezioni personalizzate
Non necessariamente:
function assert(value,message,Exctype) {
if(value !== true) throw new Exctype(message);
}
.
I costruttori sono funzioni.Le funzioni sono i valori di prima classe.Sentiti libero di passarli.