генерация и логирование ошибки
Кто знаком с php, тот знает, что там есть замечательная функция trigger_error('my error'). Функция генерирует пользовательскую ошибку: E_USER_NOTICE/WARNING/ERROR.
Если определен собственный обработчик ошибок, то все это вместе позволяет в удобном виде логировать ошибки скрипта, а также свои ошибки. Например
<?php
if(/* что-то пошло не так */){
trigger_error('текст ошибки');
}
?>
В обработчике ошибок ловим саму ошибку, имя файла и номер строки, где произошла ошибка. Ну и там же доступен контекст и трассировка. При генерации такой ошибки скрипт не останавливается - это не исключение. На js я переопределил window.onerror и написал функцию логирования ошибок на сервере. Так вот интересует вопрос, как в js реализовать аналог trigger_error из php. То есть чтобы можно было сгенерировать ошибку, но не останавливать выполнение. А в обработчике ошибок хотелось бы помимо текста ошибки узнать файл и номер строки, где произошла ошибка. Ну и естественно при генерации ошибки хочется указать только текст ошибки, а передачу имени файла и номера строки возложить на плечи функции. Как бы такое сделать? |
|
Цитата:
Я думаю, что нужно как-то унаследовать стандартный Error, но чтобы номер строки и файл были приведены к единому виду независимо от браузера. И тогда можно будет просто делать triggerError(new UserError('текст ошибки')); |
Есть некроссбраузерный вариант:
alert( (new Error).stack ) |
Цитата:
В FF есть lineNumber и fileName, в IE теже свойства зовутся иначе, в хроме вообще непонятно что. А еще ведь есть куча браузеров... window.onerror ведь ловит файл и строку. Вот нужно тоже самое, только без генерации реальной ошибки, которая остановит скрипт. Нужно кроссбраузерно получить файл и строку, где был создан объект Error |
Думал прокатит, но чот нигде не заработало, хотя CustomEvent нормально диспатчится, а ErrorEvent не хочет :(
window.addEventListener("error", function (event) {
console.log(event);
});
function triggerError(error) {
var event = new ErrorEvent(error.message, {
lineno: error.lineNumber,
filename: error.fileName
});
window.dispatchEvent(event);
}
triggerError(new Error("test error"));
|
в случае ошибки на клиенте скрипт не перестает работать, а консоль браузера вывалит ошибку. Там вам и текст ошибки и файл и номер строки - все есть.
Вам этой информации недостаточно или я чего-то не понимаю? |
Цитата:
|
dmitry111, он же php'шник, он наверно и не знает что в браузерах встрена консоль ошибок )
Мне ее как раз и не хватает при работе с сервером. Есть конечно и для серверов отладчики, но они какие-то кривые. |
Цитата:
|
dmitry111,
Моя ошибка - не написал для чего все это. Для того чтобы отправить сведения об ошибке на сервер для логирования. То есть я пишу в коде triggerError('ошибка!') и все. Дальше я хочу чтобы эта функция передала на сервер не только текст ошибки, но и файл/строку, где была вызвана. Цитата:
Цитата:
|
|
Hapson, тебе не ошибки нужны, а пользовательские события. Можешь использовать
Цитата:
Observer, CustomEvent, ... |
dmitry111, передать не проблема, тема о trigger_event, проблема в том, что dispatchить свою ошибку не получается.
|
dmitry111,
я уже переопределил window.onerror и написал функционал отправки/логирования. Теперь нужно написать функцию-аналог trigger_error из php. Вот что есть
(function(){window.onerror = ErrorHandler;
/*** SETTING ***/
var url = window.location.protocol +"//"+ window.location.hostname +"/phpHandlerJSError.php";
var debug = true;
var serverLog = true;
function ErrorHandler(message, file, line){
if(!!serverLog){sendError(message, file, line);}
return !!debug ? false : true;
}
function sendError(message, file, line){
var xhr = getXHR();
var param = "message="+ encodeURIComponent(message) +"&";
param += "file="+ encodeURIComponent(file) +"&";
param += "line="+ encodeURIComponent(line);
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.setRequestHeader("HTTP_X_FORWARDED_FOR", "XmlHttpRequest");
/* tmp */
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && xhr.status == 200){
alert(xhr.responseText);
}
};
xhr.send(param);
}
function getXHR(){
try{return new XMLHttpRequest();}catch(e){}
try{return new ActiveXObject("Msxml2.XMLHTTP.3.0");}catch(er){}
throw new Error("This browser does not support XMLHttpRequest");
}
}());
При ошибке сработает ErrorHandler. В дополнение к этому нужна функция, которая будет сама узнавать в каком файле и на какой строке ее вызвали. То есть, в каком-то участке кода я ожидаю, что что-то может пойти не так. Я не хочу оборачивать этот участок кода в try...catch, ради того чтобы в try по условию бросить исключение. Я хочу просто вызвать некий triggerError('ошибка') и продолжить выполнение. triggerError должен определить файл и строку, где его вызвали и вместе с ошибкой передаст это все в ErrorHandler, который и отправит все это на сервер |
Цитата:
|
nerv_,
что-то я не догоню, как при помощи observer такое реализовать..? |
Цитата:
|
Цитата:
try {
setTimeout(function() {
foo();
}, 1000)
} catch(e) {
alert(1); // will not work
}
window.onerror = function(e) {
alert(2);
};
Цитата:
Octane, он просто ерундой страдает :) Не хочет слушать, что советуют) Hapson, ща америку для тебя открою:
var app = {
error: function(e) {
alert(1)
}
};
app.error();
Читай про ООП. |
nerv_,
Пиши по делу, ладно? Мне нужно, чтобы при вызове определенной функции, эта функция узнала, в каком файле и на какой строке ее вызвали. В php это выглядит так
<?php
function ErrorHandler($number, $message, $file, $line, $context){
/* обработка ошибки */
}
set_error_handler('ErrorHandler');
// и теперь...
trigger_error('ошибка');
// в ErrorHandler будет передан текст ошибки, файл и строка, где был вызван trigger_error, код ошибки и контекст.
?>
|
Цитата:
ООП? какой к черту ООП - это javascript. Здесь нет никаких ООП, есть только закос под ООП |
Цитата:
твою реализацию можно сломать одной строчкой window.onerror = null; Удачного дебага. |
Цитата:
Вопрос в другом - как сделать аналог trigger_error |
Ни Chrome, ни IE не добавляют в new Error информацию о строке и файле, только в фаерфоксе норм:
window.addEventListener("error", function (event) {
alert(event);
});
function triggerError(error) {
var event;
try {
event = document.createEvent("ErrorEvent");
}
catch (reason) {
event = document.createEvent("Event");
}
if (event.initErrorEvent) {
event.initErrorEvent("error", false, false, error.message, error.fileName, error.lineNumber);
}
else {
event.initEvent("error", false, false);
event.message = error.message;
event.filename = error.fileName;
event.lineno = error.lineNumber;
}
event.stack = error.stack;
window.dispatchEvent(event);
}
triggerError(new Error("test error"));
Проверял в Chrome 35, Aurora 30 и IE11Цитата:
|
Цитата:
Даже если в js чего-то нет (например Классов), то никто не мешает вам это реализовать самому! js - это полноценный объектно-ориентированный язык! |
Цитата:
кроссбраузерные только: Error.prototype.message Error.prototype.name Зачем строка? А если весь скрипт в одну строку будет? Можно ставить переменные-метки в частях кода и передавать эти метки в случае ошибки |
Цитата:
|
dmitry111,
Вопрос не в том "зачем", а КАК. Как сделать так, чтобы функция при вызове узнавала, в каком файле и на какой строке ее вызвали. |
Цитата:
Можно вместо строки передавать с ошибкой ее номер и основываться на нем. |
У кого php головного мозга тот должен понимать что номер строки скрипта и имя файла может быть взято из html в котором любой скрипт чуйствует себя как domа.
Это не считая таких форматов как инлайновые скрипты. Файл скрипта и номер строки в этом файле в JS это _частный_ случай. Хочет браузер показать - покажет, не хочет - не покажет. WScript даже номер символа демонстрирует. Ну и что? |
Кстати, ошибки в скриптах под GM старый фаерфокс показывал как ошибки самого скрипта GM. В бытность error console еще.
|
stackoverflow.com/questions/2343343/how-can-i-determine-the-current-line-number-in-javascript
|
| Часовой пояс GMT +3, время: 21:00. |