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?
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?
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.
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 }"
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.
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 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.