window.onerror не работает на мобильных устройствах. Как мне обращаться с необработанными исключениями? - PullRequest
13 голосов
/ 05 августа 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 05 августа 2011

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

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

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

0 голосов
/ 19 ноября 2011

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

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

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

...