2012-03-08 9 views
12

jQueryに渡されるコールバック(例外ハンドラにはclick、またはthenalwaysなどのjqXHRメソッド)にスローされた例外をキャッチしたいと思います。jQueryに渡されるコールバックでスローされた例外を捕捉する方法は?

私は2つのオプションが特定されました:

  • window.onerrorハンドラ - これは、個々のコールバック内
  • 例外処理私のターゲットプラットフォームの1つである、それがAndroid上でサポートされていないため、部分的にしか解決策です - DRYしないでください!

私が考えることができる唯一のもう一つの点は、jQueryメソッドをオーバーライドすることですが、jQueryをアップグレードするときに問題が発生する可能性があります。 AJAXハンドラの場合、$ .ajaxSetupを(おそらくExceptions thrown in jQuery AJAX callbacks swallowed?の回答ごとに)使用することができますが、すべてを捕まえることができるかどうかはわかりません。

その他のオプションはありますか?

答えて

15

あなたはこのように、各コールバックをラップすることができます:あなたの代わりに実際のコールバックを渡すので、Ajax呼び出しにコールバックを渡すために行くとき、あなたはcbWrapper(callback)を渡し、そう

function cbWrapper(fn) { 
    return function() { 
     try { 
      return(fn.apply(this, arguments)); 
     } catch(e) { 
      // handle all your exceptions here 
     } 
    }; 
} 

$.get(url, cbWrapper(myRealCallback)); 

またはインライン匿名のバージョンは次のように次のようになります。それを行うの

$.get(url, cbWrapper(function() { 
    // actual callback code here 
})); 

より高度な方法は、自動的にコールバックをラップ独自の実装で$.get()を上書きすることであろうが、それはトリッキーな取得なぜなら、jQueryは実際に引数が渡されるために非常に柔軟であるからです。このため、また、特定の引数をオーバーライドしてこの作業を行う必要があるため、どの引数が存在し、どの実際の関数パラメータに対応するのかを把握する引数検出コードをすべて複製する必要があります。そのコードはちょっと面倒です。 jQueryが壊れてしまった場合、既存のjQueryコードが壊れてしまいますが、それはあまりクリーンではないため、おそらく破損しません。それはすべてあなた自身のコードなら

して、あなただけの引数の位置に非常に柔軟ではありません$.get()の独自のバージョンを作成し、実際の$.get()の代わりにそれを使用するようにコードのすべてを切り替えることができます:

jQuery.fn.myGet = function(url, fn) { 
    return(jQuery.get(url, cbWrapper(fn))); 
}