Domanda

OK.Mi potrebbe dividere i capelli qui, ma il mio codice non è coerente e mi piacerebbe farlo.Ma prima di farlo, voglio essere sicuro che sto andando per la strada giusta.In pratica questo non importa, ma questo è stato mi dà fastidio per un po', così ho pensato di chiedere ai miei colleghi...

Ogni volta che uso un try... catch istruzione, nel blocco catch ho sempre registrare un messaggio al mio interno della console.Comunque i miei messaggi di log non sono coerenti.Essi assomigliano:

catch(err) {
DFTools.console.log("someMethod caught an error: ",err.message);
...

o:

catch(ex) {
DFTools.console.log("someMethod caught an exception: ",ex.message);
...

Ovviamente il codice funzioni correttamente in entrambi i modi, ma si tratta di cominciare a preoccuparsi di me che io a volte, fare riferimento a "errori" e, a volte, di "eccezioni".Come ho detto, forse mi sto spaccando i capelli, ma che è corretto terminologia?"L'eccezione", o di "Errore"?

È stato utile?

Soluzione

Questo è un po ' soggettivo, ma per me un errore è quando qualcosa o qualcuno fa qualcosa di sbagliato, errato o non valido.Potrebbe essere un errore di sintassi, un errore logico, un errore di lettura, un errore dell'utente, o anche un sociale di errore.E ' un concetto astratto.

Un'eccezione, invece, è un oggetto che viene creato e generato quando si verifica una determinata condizione in codice.Si può o non può corrispondere a un errore concettuale.Quindi, per me, la corretta nomenclatura è "l'eccezione".

Altri suggerimenti

Il ECMAScript specifica li chiama eccezioni.Si potrebbe desiderare di fare lo stesso.

Per rendere la vostra registrazione più informativo:

catch(ex) {
    DFTools.console.log("someMethod caught an exception of type " 
       + ex.name + ": ", ex.message);

Si potrebbe anche voler tenere a mente che le eccezioni (purtroppo) possono essere di qualsiasi tipo, e quindi non necessariamente name e message proprietà:

catch(ex) {
    if (ex.message && ex.name) {        
        DFTools.console.log("someMethod caught an exception of type " 
           + ex.name + ": ", ex.message);
    } else /* deal with it somehow */

Questo sta cominciando a guardare piuttosto ingombrante per ripetere ovunque, si potrebbe voler catturare in una funzione:

function logExceptions(methodName, action) {

    try {

        action();

    } catch (ex) {
        if (ex.message && ex.name) {        
            DFTools.console.log("someMethod caught an exception of type " 
               + ex.name + ": ", ex.message);
        } else {
            DFTools.console.log("someMethod caught a poorly-typed exception: " + ex);
        }
    }
}

Ora si può dire:

logExceptions(function() {

    // do some risky stuff...

});

In JavaScript è chiamato Errore di Cattura.Quindi, vorrei suggerire di utilizzare errore invece di eccezione.Lasciare la scelta a metà con "e".Come negli esempi di Mozilla.Mozilla Core JavaScript 1.5 Riferimento

Eccezione è qualcosa che si può attesi per esempio, nel tentativo di aprire un file può affrontare un "File non trovato"eccezione.D'altra parte, gli errori sono qualcosa che si può non vedere che sta arrivando, come lo stack di flusso o di memoria non sufficiente.

Un'eccezione è un'alternativa logica di fuori di una funzione che non produce un risultato logico.Un'eccezione consente anche una migliore spiegazione di ciò che accade perché non esiste in questo modo.Per apertura di un File, di nuovo, un handle di file è un risultato logico e se il file non esiste (una possibile eccezione) o si tratta di una cartella e non un file (un altro possibile eccezione).

PRINCIPALI RESPONSABILITÀ: Io non ritengo che ci sia una risposta "giusta" per questo.Le opinioni espresse qui sono soggettivi e personali.Che cosa è più è che le idee che mi sto per sposare sono utili solo se avete intenzione di fare cose diverse con diversi, ahem, difetti...come potrebbe essere l'utilizzo di un sistema come per Daniel Earwicker informativo di risposta.Con questo in mente:

Io sostengo che "un'ECCEZIONE è eccezionale".Un ERRORE è meno inaspettato.

disclaimer: Il seguente pseudo-codice non è buona;esso serve unicamente come minimo caso potrei pensare di illustrare il mio punto.

nota: in questo esperimento, GetFile restituisce UNDEFINED se non impossibile trovare il file specificato.

function AlwaysGetFile(name){
    var file = null;
    if(FileExists(name)){
        file = GetFile(name);
        if(typeof file === "undefined"){
            throw new "couldn't retrieve file" EXCEPTION
        }
    }
    else{
        throw new "file does not exist" ERROR
    }
    return file;
}

Nel caso In cui un consumatore chiamate GetFileOrThrow con un nome che non esiste, si verificherà un ERRORE.A mio avviso la distinzione è davvero superiore a livello di codice (o input dell'utente), sta facendo qualcosa di sbagliato...questa funzione deve passare un ERRORE la linea a che la più alta a livello di codice che può decidere cosa fare in merito a questo risultato.Considerare come questo...questa funzione dovrebbe essere dicendo a qualsiasi consumo di funzioni:

Guarda, il mio amico, so cosa sta succedendo qui:si tratta di un ERRORE di richiesta BobAccounts.xml, in modo da non farlo di nuovo!Oh, e se si pensa ora sapete cosa potrebbe essere andato storto (avendo abusato di me), andare avanti e cercare di recuperare da esso!

Consideriamo ora il caso in cui tale funzione prende il nome, controlla che il file esista e che poi per qualche motivo non riesce a recuperare.Questa è una situazione diversa.Qualcosa di davvero inaspettato è accaduto.Cosa c'è di più, il consumo di codice non è colpa.Ora siamo davvero si desidera utilizzare questa funzione per dire a qualsiasi consumo di funzioni:

Oh fiddlesticks!Mi dispiace, ti prego umilmente il vostro perdono, ma qualcosa di ECCEZIONALE che io non capisco è andato storto.Non credo che la tua richiesta per BobAccounts.xml era irragionevole...e so che dovrei essere gratificante per voi.Dato che io sono di livello inferiore codice di te, dovrei sapere cosa sta succedendo...ma io non...e visto che hai meno possibilità di me di capire questa situazione ECCEZIONALE, penso che si sarebbe probabilmente meglio solo di fermare quello che stai facendo e lasciare questo messaggio di andare tutta la strada verso l'alto...Voglio dire, c'è qualcosa di seriamente di strano sta succedendo qui.

Quindi suppongo che la mia sintesi è questo:Se l'errore è accaduto nell'ordine superiore codice (erano passati bad dati) genera un ERRORE.Se l'errore è accaduto in basso il codice d'ordine (una funzione che si dipendeva non è riuscito in un modo che non capivo e non riuscivo a piano) lanciare una ECCEZIONE...e se l'errore è accaduto in funzione in fase di scrittura,...bè, se sei a conoscenza quindi risolvere il problema!

E, infine, per rispondere alla domanda originale più direttamente:In termini di gestione degli ERRORI e delle ECCEZIONI, il mio consiglio sarebbe:Gestire tutti gli ERRORI con grazia (facoltativamente la registrazione di loro)...ma gestire con attenzione le ECCEZIONI infatti;solo provare a recuperare da un'ECCEZIONE se si è veramente sicuri di sapere che cosa è e perché è successo, altrimenti lasciare bolle (generazione ripetuta se è necessario).

Quello che si ottiene in un blocco Catch è un'Eccezione, così ho il nome come un'eccezione...

Se si tratta di un errore - sono in grado di gestire nel mio codice & io di solito non aspettatevi di vedere nel blocco Catch

HTH.

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