Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   генерация и логирование ошибки (https://javascript.ru/forum/misc/46253-generaciya-i-logirovanie-oshibki.html)

Hapson 03.04.2014 08:51

генерация и логирование ошибки
 
Кто знаком с php, тот знает, что там есть замечательная функция trigger_error('my error'). Функция генерирует пользовательскую ошибку: E_USER_NOTICE/WARNING/ERROR.
Если определен собственный обработчик ошибок, то все это вместе позволяет в удобном виде логировать ошибки скрипта, а также свои ошибки. Например
<?php
if(/* что-то пошло не так */){
    trigger_error('текст ошибки');
}
?>

В обработчике ошибок ловим саму ошибку, имя файла и номер строки, где произошла ошибка. Ну и там же доступен контекст и трассировка.
При генерации такой ошибки скрипт не останавливается - это не исключение.

На js я переопределил window.onerror и написал функцию логирования ошибок на сервере. Так вот интересует вопрос, как в js реализовать аналог trigger_error из php.
То есть чтобы можно было сгенерировать ошибку, но не останавливать выполнение. А в обработчике ошибок хотелось бы помимо текста ошибки узнать файл и номер строки, где произошла ошибка. Ну и естественно при генерации ошибки хочется указать только текст ошибки, а передачу имени файла и номера строки возложить на плечи функции.

Как бы такое сделать?

ksa 03.04.2014 09:37

Цитата:

Сообщение от Hapson
Как бы такое сделать?

Все, что есть...
http://javascript.ru/try-catch

Hapson 03.04.2014 09:47

Цитата:

Сообщение от ksa (Сообщение 305784)
Все, что есть...
http://javascript.ru/try-catch

Некошерно оборачивать каждую генерацию ошибки в try...catch.
Я думаю, что нужно как-то унаследовать стандартный Error, но чтобы номер строки и файл были приведены к единому виду независимо от браузера.
И тогда можно будет просто делать
triggerError(new UserError('текст ошибки'));

Sweet 03.04.2014 09:58

Есть некроссбраузерный вариант:
alert(  (new Error).stack  )

Hapson 03.04.2014 10:06

Цитата:

Сообщение от Sweet
Есть некроссбраузерный вариант:

В том-то и дело, что не кроссбраузерный.
В FF есть lineNumber и fileName, в IE теже свойства зовутся иначе, в хроме вообще непонятно что. А еще ведь есть куча браузеров...
window.onerror ведь ловит файл и строку. Вот нужно тоже самое, только без генерации реальной ошибки, которая остановит скрипт. Нужно кроссбраузерно получить файл и строку, где был создан объект Error

Octane 03.04.2014 10:58

Думал прокатит, но чот нигде не заработало, хотя 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 03.04.2014 11:27

в случае ошибки на клиенте скрипт не перестает работать, а консоль браузера вывалит ошибку. Там вам и текст ошибки и файл и номер строки - все есть.

Вам этой информации недостаточно или я чего-то не понимаю?

nice_try 03.04.2014 11:46

Цитата:

Сообщение от dmitry111 (Сообщение 305807)
в случае ошибки на клиенте скрипт не перестает работать

смотря какие ошибки

danik.js 03.04.2014 11:54

dmitry111, он же php'шник, он наверно и не знает что в браузерах встрена консоль ошибок )

Мне ее как раз и не хватает при работе с сервером. Есть конечно и для серверов отладчики, но они какие-то кривые.

dmitry111 03.04.2014 11:54

Цитата:

Сообщение от nice_try
смотря какие ошибки

речь о том, что процесс не падает, в отличии от сервера


Часовой пояс GMT +3, время: 07:35.