Регистрировать ошибки с трассировкой стека в JavaScript
Я пытаюсь регистрировать ошибки 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, часть "try { i.dont.exist += 0; }" больше не генерирует никаких исключений, и двигатель останавливается без ошибок. В приведенном выше примере с расширением catcherr следующим образом только "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 возникает ошибка?
3 ответа
Я не знаю, почему у вас есть эта проблема (это выглядит очень странно, и я не думаю, что это проблема с JQuery, использующим ваши исключения, так как ваше оповещение (1) не сработало), но я хотел упомянуть вашу использование Error.stack - когда onerror
Если вызывается событие, у вас нет стекового контекста исходной ошибки, поэтому получение трассировки стека в этой точке (путем перехвата вашей собственной ошибки) не даст значимого стека.
Но вернемся к реальному ответу - вместо того, чтобы смоделировать проблему путем написания специально испорченного кода, чтобы вы могли уловить ошибку, как насчет того, чтобы просто вызвать ошибку? Первая строка в вашем обработчике ошибки может быть:
try { throw new Error("dummy"); } catch (e) { alert(e.stack); }
Это действительный код, который, скорее всего, не вызовет у вас проблем.
Скорее всего, jQuery упаковывает обратный вызов в свой собственный try/catch и игнорирует ошибку.
Попробуйте другое исключение внутри try/catch. например, a=1/0 или baddarr[5]='bad' и посмотрите, не вызывают ли эти исключения исключения. Иногда ошибки "Объект не найден" могут возникать из-за того, что объекты еще не загружены, и обработка этих данных может отличаться от других исключений.