JavaScriptの異常を処理する一つの考え
6350 ワード
ネット、ブラウザの問題、キャッシュなどにより、オンラインでjsを実行する場合と開発環境が異なる場合があります.js異常は基本的に先端開発エンジニアの日常茶飯事です.どのように記録して、それを使って、とても少ない人は関心を持ちます.最近は一つの考えを考えています.基本的には二つのステップがあります.収集と使用です.
一、集める
このブロックを収集するためには、各ブラウザに一つのインターフェースがあるからです.
二、使う
前に宝を支払う時、オンラインでjsのエラーがメールになります.先端開発チームに送ります.一人一人が自分で受け取り、解決します.実はこれは悪くない選択で、最も基本的な問題をも解決しました.すぐに応答して、修理します.しかし、同じ間違いを避けるためにも問題があります.私の初歩的な考えはこうです.は、URLを単位として、同じページのエラーを記録する. 記録エラーは、Page URL、User Agent、Script URL、Err Message、Line Number を含む.各エラーが解決されたら、同じところに解決案を書いてもいいです.見た人は評論して点数を上げて、最終的には保存します.知識庫として便利なアプリを使って、これらの知識庫の内容を使ってもいいです. 開発時、同じページ を与える.開発者は、知識庫のラベルを購読して、メールを自動的に受信することができます(もちろん、ファイルの注釈、mappingなどの方法でより良い対をすることもできます).
なぜこのようにしますか?主に次の問題を解決するためです. 知識ライブラリを形成し、開発者はそこから学ぶことができます.特に新人 ツールは、効率の向上と重複エラーの回避を保証する .購読保証通知は、よりターゲット である.
三、注意点
1.収集時にPOSTで送る
Errer Messageは、長い場合もありますが、ブラウザのURL長は制限があります.保存エラーが少ない場合は、GETで送ることも考えられますが、POSTは通常、すべてのデータをバックグラウンドに送信することができます.
2.データの送信はいつですか?
トリガ
3.データベースに保存するなら、どのインデックスがいいですか?
通常はURLで複数のサイトに合うかもしれません.しかし、一般的なネット、タオバオなどのUGCの比較的多いウェブサイトのように、URLを記録するために融通をきかす必要があるかもしれません.何しろ違うスレのURLは同じコードです.
エリロをインデックスにしますか?そんなことでも自分の好みで選んでください.
4.すべてのエラーを記録するかどうか
これも需要に応じて適切です.ネットには様々なめちゃくちゃなエラーがあります.全部baidu/Googleからのロードチェーンかもしれません.
四、結語
現在は収集ツール(sofish/stacktrace.js)と記憶方式(URLを索引とする)を初歩的に実現しましたが、継続するかどうかはまだ時間がかかります.
五、付録
一、集める
このブロックを収集するためには、各ブラウザに一つのインターフェースがあるからです.
window.onerror = function(errorMessage, scriptURL, lineNumber) {
alert(errorMessage, scriptURL, lineNumber)
}
さらに、window.onerror
にtry/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のエラーがメールになります.先端開発チームに送ります.一人一人が自分で受け取り、解決します.実はこれは悪くない選択で、最も基本的な問題をも解決しました.すぐに応答して、修理します.しかし、同じ間違いを避けるためにも問題があります.私の初歩的な考えはこうです.
window.onerror
の時、プラグインを通じて、Errer Messageがタイプを識別し、URLの判断を加えて、開発者に前の人が犯したエラーを警告するなぜこのようにしますか?主に次の問題を解決するためです.
三、注意点
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.