8

私は現在、Web アプリケーションに取り組んでいます。ページ内の js コードでキャッチされない Javascript エラーを処理する JS ロギング メカニズムがあります。window.onerror を使用して、そのようなエラーをすべてキャッチし、他の場所に記録しています。

ただし、問題は window.onerror イベントを持たない Opera にあります。私が考えることができる1つのアプローチは、すべてのjs関数コードを文字列処理し、ボディロード後にそれらの関数内にtry catchブロックを挿入することです。うまくいかないことも多いですが、ある程度はうまくいきます。

私はこのアプローチが悪いと確信していますが、もっと良いものは考えられませんでした. お知らせ下さい。

更新: 今のところ、以下のコードを呼び出して、できるだけ多くのエラーをキャッチしています。

function OnBodyLoad()
{
        var allElements = document.getElementsByTagName("*");
        for(var cnt = 0;cnt < allElements.length;cnt++)
        {
            RegisterAllEvents(allElements[cnt]);
        }
}
function RegisterAllEvents(objToProcess){
    for(var cnt = 0;cnt < objToProcess.attributes.length;cnt++){
        if(IsAttributeAnEvent(objToProcess.attributes[cnt].name))
        {
            objToProcess.attributes[cnt].value =  'try{'+objToProcess.attributes[cnt].value+'}catch(err){LogError("'+ objToProcess.id+'"'+ ',err);}';
        }
    }
}
4

4 に答える 4

9

Opera 11.60+ はwindow.onerror.

Opera のDragonflyはリモート デバッグをサポートしています。ハッキングして(すべて JavaScript で記述されています)、自分でエラーを記録できる可能性があります (残念ながらプロトコルはまだ公開されていません)。

于 2009-03-15T20:37:55.363 に答える
5

Opera では Error.prototype.toString を置き換えることができます。

window.onerror = function (msg) {
  // send msg to http://errors.net/log.php, for example
  (new Image()).src = 'http://errors.net/log.php?msg=' + encodeURIComponent(msg);
};
if (({}).toString.call(window.opera) === '[object Opera]') {
 (function () {
   var x = Error.prototype.toString;
   Error.prototype.toString = function () {
     var msg = '';
     try {
       msg = x.apply(this, arguments);
       if (typeof (window.onerror) === "function") {
         window.onerror(msg, typeof (this) === 'object' ? this.stack : '', '');
       }
     } catch (e) {}
     return msg;
   };
 }());
}

どうやら、Opera 11.50では機能しないようです...初期バージョンのみ...

于 2011-06-14T10:48:37.383 に答える
2

これはSafari、AFAIKでも発生します。

確かにできることは、テキスト解析の代わりに、すべてのJSコードに対してグローバルなtry / catchブロックを作成することです。これは、次のような場合には注意が必要です。

(function ($){
  $(function (){
  });
})(jQuery);
于 2009-03-14T17:22:31.893 に答える
0

ここで、Opera が wi​​ndow.onerror をサポートするようになったという言及があります。

http://my.opera.com/ODIN/blog/2011/11/07/what-s-new-in-opera-development-snapshots-4-november-2011-edition

ただし、window.onerror は Opera Mini では機能しないようです (例: ユーザー エージェント "Opera/9.80 (J2ME/MIDP; Opera Mini/7.1.32422/30.3214; U; en) Presto/2.8.119 Version/11.10")。これにより、Opera Mini を使用してモバイルで JavaScript をデバッグすることが非常に困難になります。

于 2013-06-22T20:29:56.390 に答える