window.onerror no funciona en dispositivos mobilees: ¿cómo debo manejar las excepciones no controladas?

Estoy trabajando en una aplicación web compleja escrita en Sencha Touch y PhoneGap. La forma en que se escriben las aplicaciones Sencha Touch hace que sea difícil rodear cada punto de falla potencial con un try / catch, especialmente con controlleres asynchronouss de requestes AJAX.

También es críticamente importante detectar cuándo se produce una exception no controlada porque se ve y se siente como una aplicación nativa con PhoneGap (es decir, no podemos esperar que actualice la página e intente nuevamente como en una aplicación web que ve en un browser normal).

¿Puede sugerir una recomendación sobre cómo lidiar con este escenario?

Es una gran pregunta. Por supuesto, el evento de error window nunca debe replace los bloques de try/catch colocados estratégicamente o el buen uso de las respuestas de error de las requestes HTTP, pero hasta que los browseres mobilees no se pongan al día con las versiones de escritorio, es casi imposible informar errores realmente inesperados.

No tengo time para probar esto; así que todo lo que puedo sugerir es un experimento mental en este momento para lo que con toda honestidad probablemente sea una mala idea

Podría escribir funciones de reemploop para addEventListener (y tal vez dispatchMethod ) que podrían envolver los arguments nativos de funciones / manejadores con try/catch y llamar a un registrador de errores global personalizado. Como no hay una manera fácil de 'enganchar' estas funciones de una vez, sin duda significaría iterar sobre muchos de los prototypes de objects nativos en la window para realizar el 'envoltorio'. Esto podría cubrir una gran mayoría de las excepciones que actualmente se silenciarían.

No creo que deba ser costoso para envolver de forma segura a todos los controlleres relevantes. Lo más probable es que usted (o Sencha Touch) ya estén confiando en algo como jQuery para establecer sus controlleres de events de la manera más multiplataforma. Por lo tanto, todo se está configurando con un pequeño número de funciones, por lo que solo hay algunos lugares que necesitan parches.

En otras palabras, no intente parchar en el nivel más bajo (addEventListener de cada nodo). Parche (o escriba) algunas funciones de la biblioteca y luego úselos siempre para establecer sus oyentes de events.

Si carga su código de captura de errores primero (antes de que alguien más tenga la oportunidad de get references a las funciones relevantes), y aplique el parche jQuery.bind y window.setTimeout obtendrá una cobertura bastante buena. Para Ajax, ya hay buenos anzuelos (como jQuery.ajaxPrefilter) donde puede insert sus trampas de exception envolviendo los manejadores de respuesta en cierres.