Estoy buscando para empezar a hacer mi JavaScript un poco más a prueba de errores, y yo estoy encontrando un montón de documentación sobre el uso de try
, catch
, finally
, y throw
, pero no voy a encontrar un montón de consejos de expertos sobre cuándo y dónde tirar errores.
- ¿Debería cada pieza de código estar envuelta en un try / catch?
- ¿Hay más consejos como este en qué punto se deben detectar los errores?
- ¿Existen desventajas para generar errores en lugar de que el código falle silenciosamente en la producción?
- Esto se ha tocado en SO en cuanto a implementaciones, pero ¿los errores JS de registro del servidor son una estrategia efectiva?
- ¿Algo más que deba saber sobre los errores de captura en mi aplicación?
También estoy completamente listo para escuchar libros que tienen grandes capítulos o explicaciones detalladas sobre el manejo de errores. JavaScript elocuente toca el asunto, pero no es muy prescriptivo ni es obstinado sobre el tema.
¡Gracias por cualquier consejo que puedas dar!
javascript
error-handling
Joshua Cody
fuente
fuente
Respuestas:
Se puede encontrar un conjunto de diapositivas inmensamente interesante en el Manejo de errores de JavaScript de empresa en http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/
En resumen, resume:
Las diapositivas entran en muchos más detalles y probablemente te darán alguna dirección.
ACTUALIZAR
La presentación mencionada anteriormente se puede encontrar aquí: http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation
fuente
Nicholas Zakas de Yahoo! Fame hizo una charla sobre Enterprise Error Handling ( diapositivas ) en Ajax Experience 2008, en la que propuso algo como esto:
Un año después, Nicholas Zakas publicó una actualización en su blog que incluía un patrón inteligente para inyectar automáticamente el código de manejo de errores en su entorno de producción (utilizando programación orientada a aspectos).
Cuando comience a registrar las llamadas de window.error, notará dos cosas:
Reducir el torrente de entradas de registro es tan simple como probar la gravedad y / o un número aleatorio antes de iniciar sesión en el servidor:
El manejo de los inútiles errores "window.error en undefined: 0" depende de la arquitectura de su sitio, pero puede intentar identificar todas las llamadas de Ajax y lanzar una excepción cuando algo falla (posiblemente devolviendo un seguimiento de pila usando stacktrace.js ).
fuente
if (global.logJSError) if (Math.random() < .01) logJSError('bootloader', {
(es cierto que el código no limita todos los errores, solo una clase específica de errores de tiempo de espera)IHMO, debe usar el manejo de errores en javascript como lo hace en varios otros idiomas (AFAIK: Python, Java).
Para una mejor legibilidad (y probablemente un mejor rendimiento, aunque no estoy seguro de que tenga un gran impacto), debe usar el bloque try / catch principalmente en los siguientes casos:
La parte del código que desea ajustar es una parte clave de todo el algoritmo . Si falla, podría:
Sabes que el código que estás escribiendo no es compatible con todos los navegadores
Eventualmente, los expertos en JavaScript pueden tener otros elementos para dar.
mis 2 centavos a la caja,
Saludos,
Max
fuente
Además de las otras respuestas: una cosa importante es utilizar los datos de contexto disponibles en los objetos de error de JavaScript y en los
window.onerror
parámetros de la función.Cosas como el stacktrace (errorObject.stack), el nombre del archivo, el número de línea y el número de columna. Tenga en cuenta que cada navegador tiene algunas diferencias ... así que haga su mejor esfuerzo para obtener buenos errores.
Incluso puede haber problemas con el objeto de la consola en sí . Utilizo una función personalizada window.onerror inspirada en esta y una función especial para rastrear cualquier objeto de error estándar inspirado en este código .
Otro buen punto es incluir la versión de su aplicación web en algún lugar cercano al stacktrace (para copiar y pegar de manera rápida y segura). También puede mostrar errores de forma más agresiva (alerta ...) en modo de desarrollo ya que los desarrolladores no supervisarán constantemente la consola del navegador y es posible que no vean algunos de los problemas.
También use evitar el uso
throw 'My message'
, usethrow new Error('My message')
, incluso puede tener errores personalizados, lea este artículo .Siempre agregue algo de contexto a los errores (la versión, la identificación del objeto, algún mensaje personalizado, ...) y también asegúrese de hacer una distinción entre errores externos (algunos datos externos o circunstancias hicieron que su sistema fallara) y errores internos / aserciones (su propio sistema está en mal estado), lea sobre ' Diseño por contrato '.
Aquí hay una guía .
También piense en usar el manejo general de errores como interceptores en sus bibliotecas y marcos:
fuente