2011-08-07 3 views
17

ページ上ですべてのjavascriptエラーを自分自身に送信したいと考えています。私は拡張開発者です。したがって、以下は、domを呼び出す前に準備が整っていることを確認することに重点を置いています。ページ上のすべてのjavascriptエラーを取得する/ javascriptエラー処理

throwにいくつかの機能を追加して、例外を送信したり郵送したりすることを検討しましたが、これは可能ではありませんでした。

1:このメインソリューション、window.onerrorハンドラ

window.onerror = function(e, url, line){ 
    mailError('onerror: ' + e + ' URL:' + url + ' Line:' + line); 
    console.error('\nLine ' + line + ':'); 
    setTimeout(function(){retry();}, 100); //mainly useful in content scripts for extensions, 
    return true; 
} 

もjQueryを介して、同じことを行う必要があるかもしれません:

$(window).error( 
    function(e, url, line){ 
    //handle error 
    } 
); 

は、このの没落は、あなたのことですコードの実行が停止しました。

エラーを回避して実行を停止するには、コールバックを使用してコードが特定の順序で実行されるようにし、可能な限りイベントを利用することをお勧めします。また、あなたはまた、これらの技術を使用してwindow.onload

window.onload = function(){ 
    //you page will probably twitch upon executing code at this time 
    //but you will almost never have a bad dom call 
}; 

別の技術

if (document.getElementById('iNeedThisElement')) { 
    //doin work! 
    document.getElementById('iNeedThisElement').style.display = 'block'; 
} else { 
    var stillNeedToTakeCareOfX = true; //false otherwise since it's undefined 
    mailError('iNeedThisElement was unavailable...'); 
} 

上でコードを実行することを検討することができます

$(document).ready({ 
    //you usually won't get bad dom calls wrapping your code in this 
}); 

いくつかのテクニックとDOMコールを保護し、ちょうど、デバッグすることができますアプリケーションでは、かなり上手くいくはずです。 console.error、.WARN、および.logの文が取得され、戻ってあなたに報告することができないので、小さな代替スイートは下方に設けられている。土壇場のよう

var Xe = { }; //Extreme error suite 

function extraInfo(e){ 
    //e optional 
    if(!e)e = true; 

    //add an extra debug info, such as navigator or current URL 
    return ' currentURL: '+ document.URL + 
     '\n userAgent: ' + navigator.userAgent + 
     '\n platform: ' + navigator.platform + 
     '\n userid: ' + localStorage.userid + 
     '\n language: ' + navigator.langauge + 
     '\n cookies?: ' + navigator.cookiesEnabled; 
} 

Xe.error = function(e){ 
    console.error(e); //maintain original functionality 
    mailError('Xe err: ' + e + extraInfo()); 
} 


Xe.warn = function(e){ 
    console.warn(e); 
    mailError('Xe warn: ' + e + extraInfo()); 
} 


Xe.log = function(e){ 
    console.log(e); 
    mailError('Xe log: ' + e + extraInfo()); 
} 

、あなたは絶えずのチャンクを実行しようとすることができますエラーなしで実行されるまでこれは下の「2」です。

2:グループ大きなチャンク内のコードおよびそれ以降のエラーをキャッチした後、X秒を再実行し、またはそれは次いで

//array to group function chunks 
var fn = [ ]; 

fn[1] = function(){ 
    //a large chunk of javascript 
} 
defExe(fn[1]); 

fn[2] = function(){ 
    //another chunk of your program 
} 
defExe(fn[2]); 
ように使用されるコードの次のチャンク

//defExe = DEFinitely EXEcute this code 
    //functionArg, reference to a function holding a large chunk of code 
    //seconds, timeout in milliseconds to re-attempt error free execution of this function 
function defExe(functionArg, seconds) { 
    //seconds is optional 
    if (!seconds)seconds = 300; 

    try { 
    functionArg(); 
    } catch(e) { 
    //mail the error plus extra info 
    mailError('caught ' + e + ' attempting to re-execute ' + functionArg.name + ' in ' + seconds + ' milliseconds'); 

    //re-attempt to execute this code 
    setTimeout(function(){ 
     defExe(functionArg, seconds); 
    }, seconds); 
    } 
} 

これを続けるに試み

#2概要:機能のグループコードと、try-catchブロックで実行私は私がwindow.onerrorで作業していたエラーが

+0

'fn.1'はシンタクスが無効です。 'fn [1]'を使う必要があります。 – HoLyVieR

+0

実際に私は、私がしたいのは、 "DOMがgetElementByIdに応答する"ときに発生するYUI利用可能なイベントであることを知ったと思います。http://developer.yahoo.com/yui/3/event/#onavailable 今私は、このYUIコード機能でDOM呼び出しをラップする、より巧みなdoc.byId関数を作成する必要があります。しかし、私はエラーを得るのを失うかもしれないので、まだ動いていないコードについては知りません。 –

答えて

31

をキャッチしている場合は繰り返し、それは私のJavaScriptを停止しない:

window.onerror = function(error, url, line) { 
    controller.sendLog({acc:'error', data:'ERR:'+error+' URL:'+url+' L:'+line}); 
}; 

なお、controller.sendLogは、このデータをロギングPHPに送信する関数です。

その機能の中でJavaScriptエラーが発生している可能性があります。

+0

コードをプレーンページに差し込み、実行が停止していることが判明しました。特別な環境ですか?おそらく拡張開発ですか? –

+4

エラーが発生したため、現在のスレッドの実行を停止します。これはjavascriptの通常の動作です。私はこれを使用しているページで、私はたくさんのオブジェクトとイベントをここでトリガするので、1つが壊れると、そのコードは実行を停止しますが、同じコードをトリガする新しいイベントが再び機能します。私はあなたがそれを止めるのを避けることはできないと思います。これを行う唯一の方法は、try-catchブロックをたくさん使うことです。また、try-catchブロックでも同じ動作です。ブロックの実行を止め、文をキャッチする。 –

+0

Sergiの答えは、私が知りませんでした、または上に使用しているURLと行パラメータの使用を示して以来です。 –

2

ほとんどの言語で例外が発生すると、現在のコマンドスタックの実行が停止されます。だからあなたのグローバルなwindow.onerrorのアプローチは動作しますが、失敗の後もコードを実行し続けることはありません。最初の呼び出しが失敗した場合に再試行が期待される理由は不思議です。おそらく、これを避けるためにアプリケーションを最適化する別の方法があります。

私がやりたいことの1つは、try catchブロックのwindow.onerror関数に自分のコードをラップすることです。 catchステートメント(最後の手段)では、何か致命的な問題が発生した場合に備えて、一般的に何らかの警告を使用します。ここでのアイデアは、ページのエラー処理が終了し、別のエラーが発生する原因となることがないということです。

+0

コードが後で成功することを期待するのは良い点です。 私はこれの主な目的は、コードの断片を分離して、より多くのエラーを郵送することでした。 拡張機能の開発では、コンテンツスクリプトが早すぎる/高速で実行されている可能性があるため、少し待つとページがさらに読み込まれ、ロードされる。 –

+0

それ以外の場合、ネットワークが再接続するのを待つことになるかもしれません。 –

0

あなたは... catch文

try 
{ 
    //Run your code here 
} 
catch(err) 
{ 
    //Handle the errors here 
} 
+0

エラーを例外としてスローするようにエラー関数を上書きしない限り、これはコンソールエラーでは機能しません: 'console.error = error => {throwエラー(エラー)};「これはむしろ悪い習慣です。 –

3

申し訳ありませんが試したが、キャッチは、コードのみのエラーをキャッチします/試みるも

を試すことができます(ファイルが存在しないか何かされている場合)、エラーをロードすることはありません。

window.onerror/$(window).er​​rorは間違いなく最適なソリューションです。

関連する問題