Я пытаюсь зарегистрировать ошибки JavaScript в продуктивный сайт. До сих пор это работало вполне хорошо со следующим кодом, включенным в сайт:
function catcherr(errorMessage, url, line) {
var parameters = "msg=" + escape(errorMessage)
+ "&url=" + escape(url)
+ "&line=" + escape(line);
new Image().src = "/error.gif?" + parameters;
return false;
};
window.onerror = catcherr;
Я пытаюсь добавить отслеживание стека к ошибкам получить больше информации. Это в основном работает со следующей идеей включая в функцию выше:
try { i.dont.exist += 0; } // does not exist - that's the point
catch (e)
{
if (e.stack) // Firefox
{
// do some stuff
Я использую jQuery, простой пример:
<script type="text/javascript">
jQuery(document).ready(function() {
p.foo += 1; // this should throw an error
// do stuff
});
</script>
Забавная часть, это, когда у меня есть ошибка в "готовой" функции jQuery, часть "попытка {i.dont.exist + = 0;}" больше не выдает исключения и остановок механизма ни без какой ошибки. С примером выше, и ловец, расширенный следующим образом, только "1" предупрежден:
function catcherr(errorMessage, url, line) {
try { alert(1); i.dont.exist += 0; alert(4);} catch(e) { alert(5);}
alert(2);
var parameters = "msg=" + escape(errorMessage)
// ...
}
Кто-либо имеющий идею, почему это повреждается, когда ошибка происходит в "готовой" функции jQuery?
Скорее всего, jQuery оборачивает обратный вызов в свой собственный try / catch и игнорирует ошибку.
Не знаю, почему у вас такая проблема (выглядит очень странно, и я не думаю, что это проблема, когда JQuery съедает ваши исключения, так как ваше предупреждение(1) не выстрелило бы), но я хотел упомянуть о вашем использовании Error. stack - когда вызывается событие onerror
, у вас нет контекста стека исходной ошибки, поэтому получение трассы стека в этот момент (путем перехвата вашей собственной ошибки) не даст осмысленного стека.
Но вернемся к реальному ответу - вместо того, чтобы симулировать проблему, написав специально взломанный код, чтобы вы могли перехватить ошибку, как насчет того, чтобы просто напрямую бросить ошибку? Первая строка в вашем онеррорном обработчике может быть:
try { throw new Error("dummy"); } catch (e) { alert(e.stack); }
Это корректный код, который скорее всего не вызовет у вас проблем.
.Попробуйте другое исключение внутри try/catch. например a=1/0 или baddarr[5]='bad' и посмотрим, срабатывают ли эти исключения. Иногда ошибки "Объект не найден" могут возникать из-за того, что объекты еще не загружены, и для них может быть другая обработка, нежели для других исключений.