2011-08-04 6 views
13

私はSencha TouchとPhoneGapで書かれた複雑なWebアプリケーションに取り組んでいます。 Sencha Touchアプリケーションの記述方法は、特に非同期AJAX要求ハンドラを使用すると、試行錯誤の可能性があるすべてのエラーポイントを取り囲むのが難しくなります。window.onerrorはモバイルでは動作しません - 処理されない例外はどうすれば処理できますか?

未処理の例外が発生したときに、PhoneGapのネイティブアプリに似ていると感じるため、これを検出することも非常に重要です(ページを更新して再度表示することはできません。通常のブラウザ)。

このシナリオをどのように処理することをお勧めしますか?

答えて

1

大きな質問です。もちろん、ウィンドウerrorイベントは、戦略的に配置されたtry/catchブロックを置き換えたり、HTTPリクエストからのエラー応答をうまく利用したりすることはできません。モバイルブラウザがデスクトップバージョンに追いつき、本当に予期しないエラーを報告することはほぼ不可能です。

私はこれをテストする時間がありません。私がお勧めすることができ、すべてのネイティブ関数をラップできますが、潜在的にaddEventListener(そしておそらくdispatchMethod)の交換機能を書くことができ

正直なところ、おそらく悪い考えである何のため現時点では思考実験は...です/ handler引数にtry/catchを追加し、カスタムグローバルエラーロガーを呼び出します。これらの関数を一度に「フックする」方法は簡単ではないので、ネイティブオブジェクトのプロトタイプの多くを反復して「ラッピング」を実行することは間違いありません。windowこれは、現在黙っている例外の大部分をカバーする可能性があります。

+0

私はそれが良い解決策だとは思わない。私はむしろtry/catchブロックで自動的にすべてのイベントハンドラ(Sencha Touchフレームワークイベントハンドラを含む)をラップするコードを挿入するよりも、try/catchブロックで自分のコードを手作業でラップしたいと思います。性能とバッテリー寿命が高価であるように見えますが、それでも私は完全にカバーしません。 –

0

すべての関連するハンドラを安全にラップするのに高価である必要はないと思います。ほとんどの場合、あなた(またはSencha Touch)はjQueryのようなものに頼っていて、ほとんどのクロスプラットフォームの方法でイベントハンドラを確立しています。少数の機能だけですべてが設定されているので、パッチを必要とする場所はわずかです。

つまり、最下位レベル(すべてのノードのaddEventListener)でパッチを適用しないでください。いくつかのライブラリ関数にパッチ(または書き込み)し、常にそれらを使用してイベントリスナーを確立します。

最初にエラートラッピングコードをロードして(他の誰かが関連する関数への参照を取得する前に)、パッチjQuery.bindとwindow.setTimeoutを適用すると、かなり良い適用範囲が得られます。 Ajaxの場合、クローズで応答ハンドラをラップすることで例外トラップを挿入できる良いフック(jQuery.ajaxPrefilterなど)が既にあります。