7

イベント ハンドラー内でエラーが発生すると、コードの実行が完全に停止するため、2 番目のイベント コールバックは呼び出されません。

例えば:

$(function() {
    window.thisDoesntExist();
}
$(function() {
    //Do something unharmful and unrelated to the first event
}

この (簡略化された) 例の問題は、両方の匿名関数に try/catch を追加することで簡単に解決できますが、実際には、これらの関数は多くの場合、try/catch を必要とする他のいくつかのイベント ハンドラーを追加します。try/catch ブロックが詰め込まれた、非常に反復的なコードになってしまいます。

私のプロジェクトには、各機能が異なる JS にあるモジュール設計があります (ビルド プロセス中に連結されます)。エラーが他の機能のコード実行を停止しないように、各機能内のエラーを処理するより一般的な方法を探しています。

私はすでに次の解決策を試しました: - window.onerror (この関数で true を返しても、コードの実行は停止されます)

4

5 に答える 5

5

同じボイラープレート コードの重複を防ぐヘルパー関数を作成できます。

function tryFunction(f, onerror) {
    try {
        if (typeof f == 'function') {
            return f();
        }
    } catch (e) {
        return onerror(e);
    }
}

$(function() {
    var result = tryFunction(window.thisDoesNotExist, function (error) {
        alert('Whoops: ' + error);
    });
});

ちょっとしたデモンストレーションを作成しました。少し違いますが考え方は同じです。

于 2013-05-24T07:30:19.583 に答える
0

if (typeof myFunction == 'function')電話をかける前に電話をかけることができますmyFunction()

また、必要に応じて、関数が存在しない場合にコンソールにエラーを記録することを選択できるように、バートが言ったような汎用関数でラップします。

Web アプリケーションが巨大で、多くのインタラクションと JS がある場合、多すぎるとtry catchアプリケーションの全体的なパフォーマンスが変化する可能性があります。

于 2013-05-24T07:52:28.970 に答える
0

私はあなたのためにtry catchを処理するラッパーでこのようなことを試してみます(以下を参照、またはこのjsfiddle:http://jsfiddle.net/TVfCj/2/

thisと引数を処理している (そうではない) 方法から、私が js から始めていることは明らかだと思います。しかし、あなたがその考えを理解してくれることを願っています。それは正しい/便利です.

  var wrapper = {
      wrap: function wrap(f) {
          return function (args) {
              try {
                  f.apply(null, args);
              } catch (ex){
                  console.log(f.name+" crashed with args "+args);
              };
          };
      }
  };

  var f1 = function f1Crashes(arg) {
      return window.thisDoesntExist();
  };
  var f2 = function f2Crashes(arg) {
      return window.thisDoesntExist();
  };

  var f3 = function f3MustNotCrash(arg) {
      wrapper.wrap(f1)(arg);
      wrapper.wrap(f2)(arg);
  }

  f3('myarg');
于 2013-05-24T09:33:11.920 に答える
-2

解決策を見つけました。setTimeout を使用すると、コードは別のスレッドで実行されるため、Web ページの他の部分が壊れることはありません。

$(function() {
    setTimeout(function() {
    window.thisDoesntExist();
    }, 0);
});
$(function() {
    setTimeout(function() {
        //Do something unharmful and unrelated to the first event
        alert("This passes")
    }, 0);
});

この例では、最初の関数がエラーをスローした場合でも、2 番目の関数が実行されます。これが実際の例です:http://jsfiddle.net/mathieumaes/uaEsy/

于 2013-07-14T19:34:58.797 に答える