2011-08-04 13 views
13

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 controladores asincrónicos de solicitudes AJAX.window.onerror no funciona en dispositivos móviles: ¿cómo debo manejar las excepciones no controladas?

También es críticamente importante detectar cuándo se produce una excepción 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 y vuelva a intentarlo como en una aplicación web que ve en una navegador normal).

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

Respuesta

1

Es una gran pregunta. Por supuesto, el evento ventana error nunca debe reemplazar los bloques estratégicamente ubicados try/catch o el buen uso de las respuestas de error de las solicitudes HTTP, pero hasta que los navegadores móviles se pongan al día con las versiones de escritorio, informar errores realmente inesperados es casi imposible.

No tengo tiempo para probar esto; así que todo lo que puedo sugerir es un experimento mental en el momento de lo que es en honor a la verdad probablemente una mala idea ...

Usted podría escribir funciones de reemplazo para addEventListener (y tal vez dispatchMethod) que podrían envolver las funciones nativas/maneja argumentos con try/catch y llama a un registrador de errores global personalizado. Como no hay una forma fácil de 'enganchar' estas funciones a la vez, sin duda sería iterar sobre muchos de los prototipos de objetos nativos en window para realizar el 'ajuste'. Esto podría cubrir una gran mayoría de las excepciones que actualmente se silenciarían.

+0

No creo que sea una buena solución. Prefiero envolver mi código en try/catch blocks manualmente que insertar código para envolver todos los manejadores de eventos (incluidos los manejadores de eventos de Sencha Touch framework) en los bloques try/catch automáticamente. Parece que sería caro en rendimiento y duración de la batería, y aún así no me da cobertura completa. –

0

No creo que deba ser costoso para envolver de forma segura a todos los controladores relevantes. Lo más probable es que usted (o Sencha Touch) ya estén confiando en algo como jQuery para establecer sus controladores de eventos 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 eventos.

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

Cuestiones relacionadas