Wie würden Sie verschiedene Arten von Fehlern implementieren, damit Sie bestimmte Fehler abfangen und andere in die Luft sprudeln lassen können?
Eine Möglichkeit, dies zu erreichen, besteht darin, den Prototyp des Objekts Error
zu ändern:
Error.prototype.sender = "";
function throwSpecificError()
{
var e = new Error();
e.sender = "specific";
throw e;
}
Bestimmten Fehler abfangen:
try
{
throwSpecificError();
}
catch (e)
{
if (e.sender !== "specific") throw e;
// handle specific error
}
Habt ihr Alternativen?
Um benutzerdefinierte Ausnahmen zu erstellen, können Sie vom Error-Objekt Folgendes erben:
function SpecificError () {
}
SpecificError.prototype = new Error();
// ...
try {
throw new SpecificError;
} catch (e) {
if (e instanceof SpecificError) {
// specific error
} else {
throw e; // let others bubble up
}
}
Ein minimalistischer Ansatz, ohne von Error zu erben, könnte darin bestehen, ein einfaches Objekt mit einem Namen und Nachrichteneigenschaften auszulösen:
function throwSpecificError() {
throw {
name: 'SpecificError',
message: 'SpecificError occurred!'
};
}
// ...
try {
throwSpecificError();
} catch (e) {
if (e.name == 'SpecificError') {
// specific error
} else {
throw e; // let others bubble up
}
}
Wie in den Kommentaren unten erwähnt, ist dies Mozilla-spezifisch, Sie können jedoch auch bedingte catch-Blöcke verwenden. z.B.:
try {
...
throwSpecificError();
...
}
catch (e if e.sender === "specific") {
specificHandler(e);
}
catch (e if e.sender === "unspecific") {
unspecificHandler(e);
}
catch (e) {
// don't know what to do
throw e;
}
Zumindest syntaktisch entspricht dies eher der typisierten Ausnahmebehandlung in Java.
try-catch-finally.js
_try(function () {
throw 'My error';
})
.catch(Error, function (e) {
console.log('Caught Error: ' + e);
})
.catch(String, function (e) {
console.log('Caught String: ' + e);
})
.catch(function (e) {
console.log('Caught other: ' + e);
})
.finally(function () {
console.log('Error was caught explicitly');
});