Подтвердить что ты не робот

Window.onerror не работает на мобильных устройствах. Как мне обращаться с необработанными исключениями?

Я работаю над сложным веб-приложением, написанным в Sencha Touch и PhoneGap. Написанные приложения Sencha Touch затрудняют окружение каждой потенциальной точки отказа с помощью try/catch, особенно с асинхронными обработчиками запросов AJAX.

Также крайне важно определить, когда возникает необработанное исключение, потому что оно выглядит и выглядит как родное приложение с PhoneGap (т.е. мы не можем ожидать, что они обновят страницу и повторите попытку, как в веб-приложении, которое вы просматриваете в обычном браузер).

Можете ли вы предложить рекомендацию о том, как справиться с этим сценарием?

4b9b3361

Ответ 1

Это отличный вопрос. Конечно, событие window error никогда не должно заменять стратегически размещенные блоки try/catch или хорошее использование ответов об ошибках из HTTP-запросов, но пока мобильные браузеры не догонят настольные версии, отчет о действительно неожиданных ошибках почти невозможен.

У меня нет времени проверить это; так что все, что я могу предложить, это мысленный эксперимент на данный момент для того, что во всей честности, вероятно, плохая идея...

Вы могли бы написать функции замены для addEventListener (и, возможно, dispatchMethod), которые могли бы обернуть аргументы родных функций/обработчиков с помощью try/catch и вызвать настраиваемый глобальный регистратор ошибок. Поскольку нет простого способа "зацепить" эти функции сразу, это, без сомнения, означало бы повторение многих прототипов собственных объектов на window для выполнения "обертывания". Это может охватывать значительное большинство исключений, которые в настоящее время будут молчать.

Ответ 2

Я не думаю, что это должно быть дорого, чтобы безопасно обернуть все соответствующие обработчики. Скорее всего, вы (или Sencha Touch) уже полагаетесь на что-то вроде jQuery, чтобы установить обработчики событий на самом кросс-платформенном пути. Таким образом, все настраивается небольшим количеством функций, поэтому есть только несколько мест, требующих исправления.

Другими словами, не пытайтесь исправлять на самом низком уровне (каждый node addEventListener). Запустите (или напишите) несколько функций библиотеки, а затем всегда используйте их, чтобы установить слушателей событий.

Если вы сначала загрузите код захвата ошибок (прежде чем кто-либо еще захочет захватить ссылки на соответствующие функции), а также исправить jQuery.bind и window.setTimeout, вы получите довольно хорошее покрытие. Для Ajax уже есть хорошие крючки (например, jQuery.ajaxPrefilter), где вы можете вставлять свои ловушки исключения, обертывая обработчики ответов в закрытии.