さまざまなタイプのエラーをどのように実装しますか。特定のエラーをキャッチし、他のエラーをバブルアップさせることができます。
これを実現する1つの方法は、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
}
代替手段はありますか?
カスタム例外を作成するには、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
}
}
以下のコメントに記載されているように、これはMozilla固有ですが、「条件付きキャッチ」ブロックを使用できます。例えば。:
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で使用される型付き例外処理に似たものが得られます。
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');
});