エラーを無視するコード
コードの良し悪しは別として、要件を満たすだけなら次のように書くことが可能です。
JavaScript
1'use strict';
2
35
6function callFunctionIgnoreError (fn /* [, args, [, thisArg] ] */) {
7 try {
8 return arguments.length < 3 ? fn.apply(null, arguments[1]) : fn.apply(arguments[2], arguments[1]);
9 } catch (error) {
10 return;
11 }
12}
13
1416
17function someFunction1 () {
18 throw new Error;
19}
20
2123
24function someFunction2 () {
25 return 2;
26}
27
2830
31function sample_type4 (fn) {
32 const val = callFunctionIgnoreError(fn);
33
34 if (typeof val === 'undefined') {
35 return;
36 }
37
38 return val;
39}
40
41console.log(sample_type4(someFunction1)); // undefined
42console.log(sample_type4(someFunction2)); // 2
※callFunctionIgnoreError()
には「エラーが発生せず、undefined 値が返り値になった場合」にエラーの有無を区別できない、という問題があり、返り値を次のいずれかにすれば区別できます。
JavaScript
1[success, returnValue]
2{success, returnValue}
エラーを無視して良いのか
私としては、投げられたエラーを無視して実行する try-catch
はアンチパターンと考えています。
実行を継続したいのであれば、someFunction() はエラーが発生しないようにコードを書くべきであり、エラーの有無で実行成否を判断するのが間違っています。
というわけで、関数の返り値で成否を判断するように設計を変える事を提案します。
エラーを無視せざるを得ない場合
とはいえ、例外はあります。
IE7- 向けに XMLHttpRequest
のPolyfillを書く場合、new ActiveXObject
で代替するのですが、実行成否が例外の有無で判断するしかなかった為、try-catch
を利用する必要がありました。
これは私が先人から教えて頂いた方法ですが、当時は新鮮に感じた覚えがあります。
JavaScript
1if (!'XMLHttpRequest' in this) {
2 this.XMLHttpRequest = (function () {
3 var i, l;
4
5 for (i = 0, l = arguments.length; i < l; i++) {
6 try {
7 return arguments[i];
8 }
9 catch (err) {}
10 }
11 return null;
12 })(
13 function () { return new ActiveXObject('Msxml2.XMLHTTP.6.0'); },
14 function () { return new ActiveXObject('Msxml2.XMLHTTP.3.0'); });
15}
このように、**ActiveXObject の設計を変更できないならば**、`try-catch` を利用する価値はあります。
逆にいえば、関数コードが自分のコントロール下にあるなら、設計を見直すべきと私は考えます。
Re: maisumakun さん
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/04/11 04:27