8

我目前正在开发一个 Web 应用程序,我有一个 JS 日志记录机制,可以处理页面内的 js 代码未捕获的 Javascript 错误。我正在使用 window.onerror 来捕获所有此类错误并将它们记录在其他位置。

但是,问题在于没有 window.onerror 事件的 Opera。我能想到的一种方法是,对所有 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 现在支持 window.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 回答