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:

    .
  1. non fare nulla
  2. Getta un'eccezione
  3. Assert
  4. 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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top