528 Stimmen

Was ist ein guter Weg, um Error in JavaScript zu erweitern?

Ich möchte einige Dinge in meinem JS-Code werfen und ich möchte, dass sie instanceof Error sind, aber ich möchte auch, dass sie etwas anderes sind.

In Python würde man normalerweise die Unterklasse Exception.

Was ist bei JS zu tun?

0voto

Carl Smith Punkte 2935

Benutzerdefinierter Fehlerdekorator

Dies beruht auf George Baileys Antwort , sondern erweitert und vereinfacht die ursprüngliche Idee. Es ist in CoffeeScript geschrieben, lässt sich aber leicht in JavaScript konvertieren. Die Idee ist, Baileys benutzerdefinierten Fehler mit einem Dekorator zu erweitern, der ihn umhüllt, so dass Sie neue benutzerdefinierte Fehler leicht erstellen können.

Hinweis: Dies funktioniert nur in V8. Es gibt keine Unterstützung für Error.captureStackTrace in anderen Umgebungen.

Definieren Sie

Der Dekorator nimmt einen Namen für den Fehlertyp an und gibt eine Funktion zurück, die eine Fehlermeldung annimmt und den Fehlernamen einschließt.

CoreError = (@message) ->

    @constructor.prototype.__proto__ = Error.prototype
    Error.captureStackTrace @, @constructor
    @name = @constructor.name

BaseError = (type) ->

    (message) -> new CoreError "#{ type }Error: #{ message }"

Verwenden Sie

Jetzt ist es einfach, neue Fehlertypen zu erstellen.

StorageError   = BaseError "Storage"
SignatureError = BaseError "Signature"

Zum Spaß könnten Sie nun eine Funktion definieren, die eine SignatureError wenn es mit zu vielen Argumenten aufgerufen wird.

f = -> throw SignatureError "too many args" if arguments.length

Dies wurde ziemlich gut getestet und scheint auf V8 perfekt zu funktionieren, wobei die Rückverfolgung, die Position usw. beibehalten werden.

Anmerkung: Mit new ist optional, wenn ein benutzerdefinierter Fehler konstruiert wird.

0voto

hasen Punkte 154413

Ich würde einen Schritt zurücktreten und überlegen, warum Sie das tun wollen? Ich denke, es geht darum, mit verschiedenen Fehlern unterschiedlich umzugehen.

In Python können Sie zum Beispiel die catch-Anweisung darauf beschränken, nur MyValidationError und vielleicht möchten Sie etwas Ähnliches in Javascript machen können.

catch (MyValidationError e) {
    ....
}

In Javascript geht das nicht. Es wird nur einen Catch-Block geben. Sie sollen eine if-Anweisung für den Fehler verwenden, um seinen Typ zu bestimmen.

catch(e) { if(isMyValidationError(e)) { ... } else { // maybe rethrow? throw e; } }

Ich denke, ich würde stattdessen ein rohes Objekt mit einem Typ, einer Nachricht und anderen Eigenschaften werfen, die Sie für geeignet halten.

throw { type: "validation", message: "Invalid timestamp" }

Und wenn Sie den Fehler bemerken:

catch(e) {
    if(e.type === "validation") {
         // handle error
    }
    // re-throw, or whatever else
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X