Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.04.2014, 13:17
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Как лучше ловить ошибки
Просидел вчера весь вечер, но внятного и надежного способа перехвата ошибок так и не нашел.
У меня два варианта:
window.addEventListener("error", function(e){
	console.log("e.message: "+ e.message);
	console.log("e.lineno: "+ e.lineno);
	console.log("e.filename: "+ e.filename);
	console.log("e.column: "+ e.column);
	console.log("e.error: "+ e.error);
	var stack = e.error ? e.error.stack || e.error.stacktrace || "NoStack" : "NoStack";
	console.log("stack: "+ stack);
	e.preventDefault ? e.preventDefault() : (e.returnValue = false);
});

Что это дает:
Код:
IE 11
SCRIPT5009: "testw" не определено
Файл: practice.loc, строка: 82, столбец: 3
e.message: "testw" не определено
e.lineno: 82
e.filename: http://practice.loc/
e.column: undefined
e.error: undefined
stack: NoStack

FF 28
Вообще ничего.
addEventListener вместо ErrorEvent передает Event,
в котором нет ничего про ошибку.

Chrome 33
e.message: Uncaught ReferenceError: testw is not defined 
e.lineno: 82 
e.filename: http://practice.loc/ 
e.column: undefined 
e.error: ReferenceError: testw is not defined 
stack: ReferenceError: testw is not defined
    at http://practice.loc/:82:3 

Opera 12.16
Ничего.
Стандартный вывод ошибки в консоль

Safari 5.1.7
e.message: ReferenceError: Can't find variable: testw
e.lineno: 82
e.filename: http://practice.loc/
e.column: undefined
e.error: undefined
stack: NoStack
И вот так:
window.onerror = function(mess, file, line, col, err){
	var message = mess +' In File: '+ file +' On Line: '+ line;
	var stack;
	if(arguments.length == 5 && (err.stacktrace || err.stack)){
		stack = err.stacktrace || err.stack;
	}else{
		stack = "NoStack";
	}
	console.log(message);
	console.log(stack);
	return true;
}


Тут уже интереснее
Код:
IE 11
SCRIPT5009: "testw" не определено
Файл: practice.loc, строка: 78, столбец: 3
"testw" не определено In File: http://practice.loc/ On Line: 78
NoStack

FF 28
ReferenceError: testw is not defined In File: http://practice.loc/ On Line: 78
NoStack

Chrome 33
Uncaught ReferenceError: testw is not defined In File: http://practice.loc/ On Line: 78 
ReferenceError: testw is not defined
    at http://practice.loc/:78:3 

Opera 12.16
Uncaught exception: ReferenceError: Undefined variable: testw In File: http://practice.loc/ On Line: 72
NoStack

Safari 5.1.7
ReferenceError: Can't find variable: testw In File: http://practice.loc/ On Line: 78
NoStack
Итого:
проблема 1 - window.onerror = MegaHandler; - весь логгинг пошел лесом
проблема 2 - IE и Opera чихают на все и выводят в консоль стандартные сообщения об ошибке.

Видно, что максимум инфы можно выжать только если определить обработчик, как говорят тут
https://developer.mozilla.org/en-US/...ndlers.onerror
Но как сделать так, чтобы далее в коде нельзя было его переопределить?
Ответить с цитированием
  #2 (permalink)  
Старый 05.04.2014, 20:56
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,577

Кому надо - переопределят. Ничто не мешает подменить заранее addEventListener например.)
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 06.04.2014, 13:11
Аватар для Hapson
Кандидат Javascript-наук
Отправить личное сообщение для Hapson Посмотреть профиль Найти все сообщения от Hapson
 
Регистрация: 23.07.2013
Сообщений: 122

Сообщение от Aetae Посмотреть сообщение
Кому надо - переопределят. Ничто не мешает подменить заранее addEventListener например.)
Ну да, тоже верно. Остановлюсь наверно на window.onerror.
Еще вот что интересно. Где-то видел, что вместо message в обработчик ошибок может придти объект?! И вроде что-то там было про mtssage.srcElement или message.target... точно не помню и не могу найти этот пример.
Чтож за объект туда может прилететь?

PS воспроизвести такую ситуацию что-то не получается. Если ошибка в скрипте с другого домена, то в лог летит Script error line 0 и пустой URL

Последний раз редактировалось Hapson, 06.04.2014 в 13:14.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как лучше сделать выезжающее динамическое окно? Chekist Общие вопросы Javascript 3 31.10.2013 10:34
Как лучше подготовиться к BrainBench JavaScript 8 rusich Оффтопик 16 07.09.2013 01:58
Решение проблемы кодировок для AJAX и PHP без iconv (cp1251 в AJAX) Serge Ageyev AJAX и COMET 10 24.04.2013 20:48
Ползунок как на YouTube и условие. dailclever Элементы интерфейса 1 23.07.2012 19:51
Как лучше сделать глобальный массив skyfish AJAX и COMET 4 17.02.2009 18:05