4

オブジェクトのすべてのメソッドをラップし、「try catch」ハンドラーを追加して JavaScript エラーをサーバー側に記録する、私が作成した関数についての意見を知りたいです。

window.onerrorこのセキュリティ上の制限により、を使用したくありません。私のスクリプトは、CDN の別のドメインでホストされる予定です。

/*
 * object: Object to be wrapped
 * errorHandler: Instance of ErrorHandler Object
 */
function addLog(object, errorHandler) {
    var name, method;

    for (name in object) {
        method = object[name];
        if (typeof method === "function") {
            object[name] = function(method, name) {
                return function() {
                    try {
                        return method.apply(this, arguments);
                    } catch (ex) {
                        ex.message += "; method: '" + name + "'";
                        errorHandler.addToStack(ex.message);
                        throw ex;
                    }
                };
            }(method, name);
        }
    }
    return object;
}

errorHandler.addToStackAjax メッセージを使用してサーバーにエラー レポートを非同期的に送信するカスタム オブジェクトのメソッドです。

アプリケーションでインスタンス化されたすべてのオブジェクトをこの関数でラップしたいのですが、次のことを確認できません。

  • これは悪い習慣ですか?
  • パフォーマンスの問題はありますか?
  • これを行うためのより良い方法はありますか?

前もって感謝します!

4

3 に答える 3

1

検証とチェックを追加してエラーが発生しないようにすることで、try catch ステートメントを回避するのが最善の方法だと思いますが、本当にこのようにする必要がある場合、大きなパフォーマンスの問題は発生しないと思います。

ここでそれを測定するためにjsprefテストを作成しました。違いは IE でのみ表示されますが、それほど重要ではありません。

errorHandler メソッドにパフォーマンス上の問題があるのか​​、それともコードの速度が低下するのかはわかりませんが、非同期であれば問題にはならないと思います。

于 2012-05-28T20:45:49.470 に答える
1

Java のようなより厳密なコードとは異なり、Javascript はインスタンス化されたほとんどのオブジェクトに対して try/catch を必要としません。何か問題が発生した場合、それは単に機能しない傾向があり、爆発したり、あなたに終止符を打ったりすることはありません.

ただし、一部の部分では関数が終了するため、コード全体を try/catch で囲み、コードが静かに失敗するようにし、catch を使用して元のコードを呼び出し、エラー レポートを送信することをお勧めします。

于 2012-05-28T16:47:46.420 に答える
0

例外オブジェクトには情報が含まれているため、グローバルな try/catch を使用してサーバーにログを送信できます。

ただし、エラーオブジェクトはブラウザ間で標準ではないと思います

于 2012-05-28T17:21:58.490 に答える