Comment implémenteriez-vous différents types d'erreurs, de sorte que vous seriez en mesure d'en détecter des spécifiques et de laisser les autres bouillonner ...?
Une façon d'y parvenir est de modifier le prototype de l'objet Error
:
Error.prototype.sender = "";
function throwSpecificError()
{
var e = new Error();
e.sender = "specific";
throw e;
}
Attraper une erreur spécifique:
try
{
throwSpecificError();
}
catch (e)
{
if (e.sender !== "specific") throw e;
// handle specific error
}
Avez-vous des alternatives?
Pour créer des exceptions personnalisées, vous pouvez hériter de l'objet Error:
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
}
}
Une approche minimaliste, sans hériter d'Erreur, pourrait être de lancer un objet simple ayant un nom et des propriétés de message:
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
}
}
Comme indiqué dans les commentaires ci-dessous, cela est spécifique à Mozilla, mais vous pouvez utiliser des blocs de "capture conditionnelle". par exemple.:
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;
}
Cela donne quelque chose de plus semblable à la gestion des exceptions typées utilisée en Java, au moins syntaxiquement.
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');
});