web-dev-qa-db-ja.com

JavaScriptの特定のエラーの処理(例外を考えてください)

さまざまなタイプのエラーをどのように実装しますか。特定のエラーをキャッチし、他のエラーをバブルアップさせることができます。

これを実現する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
}


代替手段はありますか?

95
cllpse

カスタム例外を作成するには、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
  }
}
128
CMS

以下のコメントに記載されているように、これは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で使用される型付き例外処理に似たものが得られます。

14
Andy

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');
});
9
c24w