Просидел вчера весь вечер, но внятного и надежного способа перехвата ошибок так и не нашел.
У меня два варианта:
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
Но как сделать так, чтобы далее в коде нельзя было его переопределить?