генерация и логирование ошибки
Кто знаком с 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, время: 03:33. |