何かを返すか、エラーをスローする関数がいくつかあります。メイン関数では、これらのそれぞれを呼び出し、各関数によって返された値を返すか、最初の関数がエラーをスローした場合は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
ブロックを削除する方法はありますか?
いいえ。それらを保持する必要があります。
これは実際には理にかなっています。エラーを黙って無視してはならないからです。
tryなしcatch句は、その試行内にcatchが定義されていない場合、エラーを次の上位のcatchまたはウィンドウに送信します。
catchがない場合、try式にはfinally句が必要です。
try {
// whatever;
} finally {
// always runs
}
いいえ、catch
(またはfinally
)はtry
の友人であり、常にtry/catchの一部として存在します。
しかし、あなたの例のようにそれらを空にすることは完全に有効です。
サンプルコードのコメント(func1がエラーをスローした場合、func2を試してください)で、あなたが本当にやりたいことはcatch
ブロック内の次の関数を呼び出すことです以前。
エラー変数なしで、ES2019で始まる空のcatchブロックを持つことが可能です。これは オプションのcatchバインディング と呼ばれ、 V8 v6.6、2018年6月にリリース で実装されました。この機能は、ノード10、Chrome 66、Firefox 58、Opera 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");
}
私自身のテストでは、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
それらは、私が知っているすべての言語(JavaScript、Java、C#、C++)で一緒に動作します。しないでください。
エラーが発生した場合に機能2と3のみを起動する場合、なぜそれらをcatchブロックに入れないのですか?
function testAll() {
try {
return func1();
} catch(e) {
try {
return func2();
} catch(e) {
try {
return func3();
} catch(e) {
// LOG EVERYTHING FAILED
}
}
}
}
別の角度から提示された問題を見ることにしました。
別のコメンターによってリストされた未処理のエラーオブジェクトに部分的に対処しながら、要求されたコードパターンを厳密に許可する方法を決定することができました。
コードを見ることができます@ 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], [], []));
ES2019なので、try {}
なしcatch {}
:
try {
parseResult = JSON.parse(potentiallyMalformedJSON);
} catch (unused) {}
詳細については Michael Ficcaraの提案 を参照してください。
try&catchは1枚のコインの2面のようなものです。試してみないと不可能です。