Обработка определенных ошибок в JavaScript (считайте исключения)
Как бы вы реализовали различные типы ошибок, чтобы вы могли поймать конкретные и позволить другим пузыриться...?
Один из способов добиться этого - изменить прототип объекта Error
:
Error.prototype.sender = "";
function throwSpecificError()
{
var e = new Error();
e.sender = "specific";
throw e;
}
Ошибка конкретной ошибки:
try
{
throwSpecificError();
}
catch (e)
{
if (e.sender !== "specific") throw e;
// handle specific error
}
У вас есть альтернативы?
Ответы
Ответ 1
Чтобы создать пользовательские исключения, вы можете наследовать объект 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
}
}
Минималистичный подход, не наследующий от Error, может вызывать простой объект с именем и свойствами сообщения:
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
}
}
Ответ 2
Как отмечено в комментариях ниже, это спецификация Mozilla, но вы можете использовать блоки "условного catch". например:.
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;
}
Это дает нечто более похожее на типизированную обработку исключений, используемую в Java, по крайней мере синтаксически.
Ответ 3
Пример
_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');
});