web-dev-qa-db-ja.com

JavaScriptで{}をキャッチせずに{}を試してみませんか?

何かを返すか、エラーをスローする関数がいくつかあります。メイン関数では、これらのそれぞれを呼び出し、各関数によって返された値を返すか、最初の関数がエラーをスローした場合は2番目の関数に進みます。

だから基本的に私が現在持っているのは:

function testAll() {
    try { return func1(); } catch(e) {}
    try { return func2(); } catch(e) {} // If func1 throws error, try func2
    try { return func3(); } catch(e) {} // If func2 throws error, try func3
}

しかし、実際には、tryのみを返します(つまり、エラーがスローされない場合)。 catchブロックは必要ありません。ただし、try {}などのコードは、(未使用の)catch {}ブロックがないため失敗します。

jsFiddleの例 と入力します。

それで、同じ効果を達成しながら、それらのcatchブロックを削除する方法はありますか?

91
pimvdb

いいえ。それらを保持する必要があります。

これは実際には理にかなっています。エラーを黙って無視してはならないからです。

19
ThiefMaster

tryなしcatch句は、その試行内にcatchが定義されていない場合、エラーを次の上位のcatchまたはウィンドウに送信します。

catchがない場合、try式にはfinally句が必要です。

try {
    // whatever;
} finally {
    // always runs
}
188
kennebec

いいえ、catch(またはfinally)はtryの友人であり、常にtry/catchの一部として存在します。

しかし、あなたの例のようにそれらを空にすることは完全に有効です。

サンプルコードのコメント(func1がエラーをスローした場合、func2を試してください)で、あなたが本当にやりたいことはcatchブロック内の次の関数を呼び出すことです以前。

10
alex

エラー変数なしで、ES2019で始まる空のcatchブロックを持つことが可能です。これは オプションのcatchバインディング と呼ばれ、 V8 v6.6、2018年6月にリリース で実装されました。この機能は、ノード10Chrome 66Firefox 58Opera 53およびSafari 11.1

構文は次のとおりです。

try {
  throw new Error("This won't show anything");
} catch { };

それでもcatchブロックが必要ですが、空にすることができ、変数を渡す必要はありません。 catchブロックがまったく必要ない場合は、try/finallyを使用できますが、空のcatchのようにエラーを飲み込むことはありません。

try {
  throw new Error("This WILL get logged");
} finally {
  console.log("This syntax does not swallow errors");
}
8
Dan Dascalescu

私自身のテストでは、tryブロックとfinallyブロックの両方でエラーがスローされると、finally節でスローされたエラーがバブルアップし、tryブロックのエラーが無視されるため、catchなしでtry-finallyをお勧めしません。

try {
  console.log('about to error, guys!');
  throw new Error('eat me!');
} finally {
  console.log ('finally, who cares');
  throw new Error('finally error');
}

結果:

>     about to error, guys!
>     finally, who cares
>     .../error.js:9
>         throw new Error('finally error');
>         ^
>     
>     Error: finally error
6
Joe B.

それらは、私が知っているすべての言語(JavaScript、Java、C#、C++)で一緒に動作します。しないでください。

1
duffymo

エラーが発生した場合に機能2と3のみを起動する場合、なぜそれらをcatchブロックに入れないのですか?

function testAll() {
  try {
    return func1();
  } catch(e) {
    try {
      return func2();
    } catch(e) {
      try {
        return func3();
      } catch(e) {
        // LOG EVERYTHING FAILED
      }
    }
  }
}
1
Tank

別の角度から提示された問題を見ることにしました。

別のコメンターによってリストされた未処理のエラーオブジェクトに部分的に対処しながら、要求されたコードパターンを厳密に許可する方法を決定することができました。

コードを見ることができます@ http://jsfiddle.net/Abyssoft/RC7Nw/4/

try:catchはforループ内に配置され、適切なフォールスルーを可能にします。必要なすべての機能を反復処理できます。明示的なエラー処理が必要な場合、追加の関数配列が使用されます。エラーの偶数で、エラーハンドラー要素を持つ関数配列が関数ではない場合、エラーはコンソールにダンプされます。

ここのstackoverflowの要件ごとにコードがインラインです[JSLintに準拠するように編集され(確認のために先頭のスペースを削除)、読みやすさを改善します]

function func1() {"use strict"; throw "I don't return anything"; }
function func2() {"use strict"; return 123; }
function func3() {"use strict"; throw "I don't return anything"; }

// ctr = Code to Run <array>, values = values <array>, 
// eh = error code can be blank.
// ctr and params should match 1 <-> 1
// Data validation not done here simple POC
function testAll(ctr, values, eh) {
    "use strict";
    var cb; // cb = code block counter
    for (cb in ctr) {
        if (ctr.hasOwnProperty(cb)) {
            try {
                return ctr[cb](values[cb]);
            } catch (e) {
                if (typeof eh[cb] === "function") {
                    eh[cb](e);
                } else {
                    //error intentionally/accidentially ignored
                    console.log(e);
                }
            }
        }
    }
    return false;
}

window.alert(testAll([func1, func2, func3], [], []));

1
user1800957

ES2019なので、try {}なしcatch {}

try {
  parseResult = JSON.parse(potentiallyMalformedJSON);
} catch (unused) {}

詳細については Michael Ficcaraの提案 を参照してください。

0
JamesJGoodwin

try&catchは1枚のコインの2面のようなものです。試してみないと不可能です。

0