JavaScriptの異常を処理する一つの考え

6350 ワード

ネット、ブラウザの問題、キャッシュなどにより、オンラインでjsを実行する場合と開発環境が異なる場合があります.js異常は基本的に先端開発エンジニアの日常茶飯事です.どのように記録して、それを使って、とても少ない人は関心を持ちます.最近は一つの考えを考えています.基本的には二つのステップがあります.収集と使用です.
一、集める
このブロックを収集するためには、各ブラウザに一つのインターフェースがあるからです.
window.onerror = function(errorMessage, scriptURL, lineNumber) {
  alert(errorMessage, scriptURL, lineNumber)
} 
さらに、window.onerrortry/catch(各ブラウザによって異なり、eriwen/javascript-stacktraceという互換性のあるライブラリを使用することができます)のようなStock Traceが提供されています.以下のコードを試してみてください.
try {
  fn()
} catch(e) {
  alert(e.stack)
} 
したがって、これらのエラーを収集するのは比較的便利であり、ここで注意すべきことは、e.stackにおけるwindow.addEventListener('error', callback, isBubble)の最初のパラメータを使用するのはcallbackではなく、eventである.このようにすれば、Error objectを便利に使うのはいい選択ですが、dotオペレータによって傍受されるイベントはリロードできますし、この傍受シナリオは理論的にはすべてのjsの先頭に置いてありますので、そのリスクを考慮する必要があります.
二、使う
前に宝を支払う時、オンラインでjsのエラーがメールになります.先端開発チームに送ります.一人一人が自分で受け取り、解決します.実はこれは悪くない選択で、最も基本的な問題をも解決しました.すぐに応答して、修理します.しかし、同じ間違いを避けるためにも問題があります.私の初歩的な考えはこうです.
  • は、URLを単位として、同じページのエラーを記録する.
  • 記録エラーは、Page URL、User Agent、Script URL、Err Message、Line Number
  • を含む.
  • 各エラーが解決されたら、同じところに解決案を書いてもいいです.見た人は評論して点数を上げて、最終的には保存します.知識庫として便利なアプリを使って、これらの知識庫の内容を使ってもいいです.
  • 開発時、同じページwindow.onerrorの時、プラグインを通じて、Errer Messageがタイプを識別し、URLの判断を加えて、開発者に前の人が犯したエラーを警告する
  • を与える.
  • 開発者は、知識庫のラベルを購読して、メールを自動的に受信することができます(もちろん、ファイルの注釈、mappingなどの方法でより良い対をすることもできます).
    なぜこのようにしますか?主に次の問題を解決するためです.
  • 知識ライブラリを形成し、開発者はそこから学ぶことができます.特に新人
  • ツールは、効率の向上と重複エラーの回避を保証する
  • .
  • 購読保証通知は、よりターゲット
  • である.
    三、注意点
    1.収集時にPOSTで送る
    Errer Messageは、長い場合もありますが、ブラウザのURL長は制限があります.保存エラーが少ない場合は、GETで送ることも考えられますが、POSTは通常、すべてのデータをバックグラウンドに送信することができます.
    2.データの送信はいつですか?
    トリガwindow.onerrorの時に送信することを推奨します.初めてこの考えを持った時はonerrorの時に送ってみましたが、POST要求はまだオープンしていないので、ブラウザに中断されました.
    3.データベースに保存するなら、どのインデックスがいいですか?
    通常はURLで複数のサイトに合うかもしれません.しかし、一般的なネット、タオバオなどのUGCの比較的多いウェブサイトのように、URLを記録するために融通をきかす必要があるかもしれません.何しろ違うスレのURLは同じコードです.
    エリロをインデックスにしますか?そんなことでも自分の好みで選んでください.
    4.すべてのエラーを記録するかどうか
    これも需要に応じて適切です.ネットには様々なめちゃくちゃなエラーがあります.全部baidu/Googleからのロードチェーンかもしれません.
    四、結語
    現在は収集ツール(sofish/stacktrace.js)と記憶方式(URLを索引とする)を初歩的に実現しましたが、継続するかどうかはまだ時間がかかります.
    五、付録
    php
    $url = new Url();
    $page = $url->post('page'); 
    
    if(!$page) return; 
    
    class ErrorTrace extends MongoData {
      // MongoData    ,   http://stackoverflow.com/a/7958954
      public function findOne($obj) {
        return $this->connection->findOne($obj);
      }
    };
    
    $store = new ErrorTrace();
    $fields = array(
      'url' => $url->post('url'),
      'message' => $url->post('message'),
      'line' => $url->post('line'),
      'ua' => $url->post('ua'),
    ); 
    
    $index = array('page' => $page);
    $hash = md5(json_encode($fields));
    
    //          ,           URL  
    if($field = $store->findOne($index)) {
      if(isset($field[$hash])) return;
      return $store->setAttr(new Query('page', $page), $hash, $fields);
    } 
    
    $store->page = $page;
    $store->$hash = $fields;
    $store->save();
    ?>
     This Gist brought to you by GitHub.