23

エラー報告のために、私が持っているすべての関数のコードの周りに try-catch ラッパーを挿入したいと思います。

だから基本的には交換したい

function foo(arg){
   bar();
}

...と...

function foo(arg){
    try {
        bar() 
    }
    catch(e){
        customErrorHandler(e)
    }
}

すべての関数を手動で編集せずに、この一般的な try-catch をすべての関数に適用する方法はありますか? たとえば、関数オブジェクトのプロトタイプを変更することによって?

編集

すべての関数を try-catch したい理由: iOS と Android で公開する HTML5 アプリを作成しています。私の現在の初歩的な JavaScript エラー レポートから、アプリが自分のデバイスで問題なく動作しても、他のデバイスではエラーが発生することがわかります。

私の目的は 2 つあります。誰かのデバイスで JavaScript エラーが発生するたびに...

  1. アプリが完全に機能しない可能性があることをユーザーに通知したい
  2. エラーが発生した場所を大まかに知りたいので、問題を探す場所がわかります
4

6 に答える 6

22

どこでも定義されているすべての JavaScript 関数を見つける方法がないため、これは単純ではありません。たとえば、そのようなアプローチでは、実行時に定義されたコールバック関数が失われる可能性があります。

また、おそらくすべての関数をラップする必要はありません。これには、ラップしたくないブラウザー関数や JavaScript ライブラリの関数が含まれるからです。

より良いアプローチは、おそらく別の関数をラップする関数を定義することです:

var tcWrapper = function(f) {
    return function() {
        try {
            f.apply(this, arguments);
        } catch(e) {
            customErrorHandler(e)
        }
    }
}

これで、この機能を使用して、好きなものを装飾できます。名前空間を使用すると、ラッピングがより簡単になります。

var NS = { f: function() {  } }

すべての関数を特別な名前空間にラップして、名前空間を反復処理するだけです。

$.each( NS, function(i,n) {
    var p = NS[i];
    if( typeof p === 'function' ) {
        NS[i] = tcWrapper(p);
    }
} );
于 2012-08-02T09:45:25.367 に答える
1

さて、ここで見つけたようです:http://www.nczonline.net/blog/2009/04/28/javascript-error-handling-anti-pattern/

基本的に、すべての関数は、try 部分に元の関数を含む try-catch ラッパーに置き換えられます。

于 2012-07-31T14:11:47.907 に答える
-3

私は(これは純粋な推測であるため、これが機能するかどうかはわかりません)、次のようなことができるのだろうか:

function callTryCatch(functionSignature) {
    try {
        eval(functionSignature);
    } catch (e) {
        customErrorHandler(e);
    }
}

function entryPoint() {
    callTryCatch(function() {
        // do function logic
    });
}

繰り返しますが、これは純粋な憶測であり、私はテストしていませんが、それが可能であるとすれば、鍵はevalステートメントにあると思います。

于 2012-07-31T14:13:10.800 に答える