Мимика Окно. Ошибка в Opera с использованием JavaScript - PullRequest
8 голосов
/ 14 марта 2009

В настоящее время я работаю над веб-приложением, у меня есть механизм ведения журналов JS, который обрабатывает ошибки Javascript, которые не обнаруживаются кодом js на странице. Я использую window.onerror, чтобы перехватывать все такие ошибки и регистрировать их где.

Однако проблема в Opera, у которой нет события window.onerror. Один из подходов, который я мог бы придумать, состоит в том, чтобы обработать все коды функций 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 ]

9 голосов
/ 15 марта 2009

Opera 11.60+ поддерживает window.onerror.

Opera's Dragonfly поддерживает удаленную отладку . Вы можете взломать его (все написано на JavaScript) и регистрировать ошибки самостоятельно (к сожалению, протокол еще не опубликован ).

5 голосов
/ 14 июня 2011

вы можете заменить Error.prototype.toString в Opera!

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 ... только для ранних версий ...

2 голосов
/ 14 марта 2009

Это также происходит в Safari, AFAIK.

Что вы, безусловно, могли бы сделать, это создать глобальный блок try / catch для всего кода JS вместо разбора текста - что может быть сложно, если вы столкнетесь с такими вещами как:

(function ($){
  $(function (){
  });
})(jQuery);
0 голосов
/ 23 июня 2013

здесь упоминается, что 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; ru) Presto / 2.8.119 Версия / 11.10" ). Это действительно затрудняет отладку javascript на мобильных устройствах с Opera Mini.

...