Frage

OK. Ich kann Haarspalterei sein hier, aber mein Code ist nicht konsistent und ich möchte es machen so. Aber bevor ich das tue, möchte ich sicherstellen, ich bin auf dem richtigen Weg. In der Praxis spielt das keine Rolle, aber das hat sich für eine Weile mich worden stört so dass ich dachte, ich meine Kollegen fragen würde ...

Jedes Mal, wenn ich eine try... catch Anweisung, im catch-Block habe ich immer eine Nachricht an meine interne Konsole anmelden. Allerdings meine Log-Meldungen sind nicht konsistent. Sie sind entweder wie folgt aussehen:

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

oder:

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

Offensichtlich ist der Code richtig funktioniert oder so, aber es fängt an mich zu stören, dass ich manchmal zu „Fehlern“ beziehen und manchmal auf „Ausnahmen“. Wie ich sagte, vielleicht bin ich Haare Splitting, aber das ist die richtige Terminologie? "Exception" oder "Error"?

War es hilfreich?

Lösung

Dies ist ein wenig subjektiv, aber für mich ein Fehler ist, wenn jemand oder etwas tut, etwas falsch, falsche oder ungültig. Es könnte ein Syntaxfehler, ein logischer Fehler, ein Lesefehler, Benutzerfehler oder sogar ein sozialer Fehler. Es ist ein abstrakter Begriff.

Eine Ausnahme, auf der anderen Seite, ist ein Objekt, das erstellt wird, und ausgelöst wird, wenn eine bestimmte Bedingung im Code auftritt. Es kann oder auch nicht zu einem konzeptionellen Fehler entspricht. Also mir, die richtige Nomenklatur „Ausnahme“.

Andere Tipps

Die ECMAScript-Spezifikation nennt sie Ausnahmen. Sie könnten ebenfalls tun wollen.

Um die Protokollierung informativer zu machen:

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

Sie möchten vielleicht auch zu bedenken, dass Ausnahmen (leider) von jeder Art sein kann, und so müssen nicht name und message Eigenschaften haben:

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 */

Da dies ziemlich umständlich zu suchen beginnt, überall zu wiederholen, könnten Sie wollen, dass es in einer Funktion erfassen:

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);
        }
    }
}

Jetzt können Sie sagen:

logExceptions(function() {

    // do some risky stuff...

});

In JavaScript ist es genannt Fehler Fangen. So würde ich vorschlagen, verwenden Sie Fehler statt Ausnahme. Lassen Sie die Wahl in der Mitte unter Verwendung von „e“. Wie in den Beispielen von Mozilla. Mozilla Core-JavaScript 1.5 Reference

Ausnahme ist etwas, das man in einem Versuch, zum Beispiel erwartet, kann eine Datei zu öffnen, kann eine „Datei nicht gefunden Ausnahme“ stellen. Auf der anderen Seite, sind Fehler, etwas, das Sie es wie Stapel nicht sehen können kommen über oder nicht genügend Speicher fließen.

Eine Ausnahme ist eine alternative logische Art und Weise einer Funktion aus, die aus keinem logischen Ergebnis führt. Eine Ausnahme ermöglicht auch eine bessere Erklärung dafür, was passieren, warum es auf diese Weise existiert. Für Datei-Öffnen wiederum ist eine Datei-Handelte eine logische Folge und wenn die Datei nicht vorhanden ist (eine mögliche Ausnahme) oder es ist ein Ordner keine Datei (ein weitere mögliche Ausnahme).

MAJOR HAFTUNGSAUSSCHLUSS: Ich glaube nicht, dass es eine „richtige“ Antwort auf diese. Die hier geäußerten Ansichten sind subjektiv und persönlich. Was mehr ist, dass die Ideen, die ich darüber espouse bin nur dann sinnvoll sind, wenn Sie verschiedene Dinge mit unterschiedlichen, ähem, Fehler machen werden ... wie Sie vielleicht ein System, wie pro Daniel Earwicker des informativen Antwort verwenden. In diesem Sinne:

Ich behaupte, dass „eine Ausnahme ist außergewöhnlich“. Ein Fehler weniger unerwartet.

Disclaimer: Der folgende Pseudo-Code ist nicht gut; es dient lediglich als Mindest Fall, dass ich von illustrieren meinen Punkt denken konnte.

. Hinweis: in diesem Gedankenexperiment, GetFile kehrt undefiniert, wenn es die angegebene Datei nicht finden kann

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;
}

Im Fall, dass ein Verbraucher ruft GetFileOrThrow mit einem Dateinamen, wird ein Fehler nicht vorhanden ist, auftritt. Meiner Meinung nach ist der Unterschied wirklich, dass auf höhere Ebene Code (oder eine Benutzereingabe) etwas falsch macht ... diese Funktion muss einen ERROR auf die Linie zu diesem übergeordneten Code übergibt, die entscheiden können, was zu diesem Ergebnis zu tun. Betrachten Sie es wie folgt ... diese Funktion würde sagen, zu irgendwelchen raubend Funktionen:

  

Sehen Sie, mein Freund, ich weiß, was hier vor sich geht: Es ist ein Fehler auf Anfrage BobAccounts.xml, so tun es nicht wieder tun! Ach ja, und wenn Sie denken, Sie wissen jetzt, was schiefgelaufen sein könnte (hat mich mißbraucht zu haben), gehen Sie voran und versuchen, sich davon zu erholen!

Nun wird der Fall betrachtet, dass diese Funktion den Namen nimmt, prüft, ob die Datei vorhanden ist und dann aus irgendeinem Grund, es abzurufen ausfällt. Dies ist eine andere Situation. Etwas wirklich unerwartet geschehen. Was mehr ist, die verzehrende Code ist nicht schuld . Jetzt wollen wir wirklich diese Funktion auf alle raubend Funktionen sagen:

  

Oh fiddlesticks! Tut mir leid, das, ich demütig bitte um Verzeihung, aber etwas Besonderes, dass ich nicht wirklich verstehen, falsch gelaufen ist. Ich glaube nicht, dass Sie Ihre Anfrage für BobAccounts.xml unvernünftig war ... und ich weiß, ich sollte es für Sie erfüllen. Da ich als Sie niedrigen Level-Code bin, soll ich wirklich wissen, was los ist ... aber ich weiß nicht ... und da Sie weniger Chancen haben als ich diese außergewöhnliche Situation zu verstehen, ich glaube, Sie würden wahrscheinlich am besten nur zu stoppen, was Sie tun und lassen Sie diese Nachricht an die Spitze des ganzen Weg gehen ... ich meine, es ist etwas, ernst fischig hier los.

So nehme ich meine Zusammenfassung ist: Wenn der Fehler in höherer Ordnung Code passiert (Sie schlechte Daten weitergegeben wurden) einen Fehler aus. Wenn der Fehler in niedrigerer Ordnung Code geschehen (eine Funktion, die Sie in einer Art und Weise versagt hing von ihr nicht verstanden und konnte nicht planen) eine Ausnahme aus ... und wenn der Fehler in der Funktion passiert schreiben Sie gerade .. gut., duh, wenn Sie sich bewusst, es dann fix it!

Und schließlich mehr direkt auf die ursprüngliche Frage zu beantworten: In Bezug auf den Fehler und Ausnahmen Handhabung, mein Rat wäre: Behandeln Sie alle Fehler graziös (optional sie Anmeldung) ... aber Griff AUSNAHMEN sorgfältig in der Tat; nur versuchen, von einer Ausnahme zu erholen, wenn Sie wirklich sicher sind, wissen Sie, was es ist und warum es passiert ist, sonst lassen Sie es sprudeln (Erneutes Auslösen es, wenn Sie müssen).

Was Sie in einem Catch-Block erhalten, ist eine Ausnahme, so dass ich es als Ausnahme nennen ...

Wenn es ein Fehler ist - ich habe es in meinem Code verarbeiten kann und ich erwarte in der Regel nicht in der Catch-Block sehen

HTH.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top