try error ejemplo catch jquery debugging exception exception-handling callstack

error - La pila de llamadas se pierde cuando se lanza una excepción dentro de un manejador jQuery



exception object javascript (3)

Sugeriría crear un objeto que se crea una instancia dentro del bloque jQuery(document).ready() . Por ejemplo:

var oStart = function(){ var pageMethod = function(){ /*...*/ } var pageMethodOther = function(){ /*...*/ } /*...*/ var init = function(){ jQuery(document).ready(function(){ /* do your stuff here */ }); } } oStart.init();

Esto te ayudará a separar la lógica de tu aplicación y la lógica de jQuery. Deberías tener muy poco en tu bloque listo. Solo aquellas cosas que son absolutamente necesarias después de que DOM se haya cargado completamente. Todo lo demás debería poder cargarse en la memoria mientras la página aún se está renderizando.

Tengo un problema al depurar mis aplicaciones web. Es muy frustrante porque he intentado reproducir el problema con una pequeña página web que puedo publicar en jsfiddle, pero este parece ser un caso del "Higgs-Bugson".

Tengo una página web con un controlador jQuery(document).ready() grande. El problema es que cuando se lanza una excepción desde el manejador jQuery(document).ready() , obtengo una pila de llamadas con varias funciones anónimas y sin un puntero al código que arrojó la excepción.

Cada vez que trato de reproducir este comportamiento con una página web pequeña, siempre obtengo un puntero al código que arrojó la excepción, pero en el código de producción, nunca obtengo el puntero de la pila. Esto hace que la depuración sea más frustrante y propensa a errores.

¿Alguien aquí alguna idea de qué podría estar causando este comportamiento y cómo hacerlo bien?

Actualización: Han pasado varios meses desde que publiqué esta pregunta y ahora creo que he reproducido definitivamente el problema. Reproduzco el problema con el siguiente HTML:

<html xmlns="http://www.w3.org/1999/xhtml" > <body> Factorial Page <input type=''button'' value=''Factorial'' id=''btnFactorial'' /> <script src="Scripts/jquery-1.6.1.js" type="text/javascript"></script> <script type=''text/javascript''> $(document).ready(documentReady); function documentReady() { $(''#btnFactorial'').click(btnFactorial_click); factorial(-1); } function btnFactorial_click() { var x; x = prompt(''Enter a number to compute factorial for.'', ''''); alert(x + ''! = '' + factorial(x)); } function factorial(x) { if (x < 0) throw new Error(''factorial function doesn/'t support negative numbers''); else if (x === 0 || x === 1) return 1; else return factorial(x - 1) * x; } </script> </body> </html>

Al mirar el código, verá que al hacer clic en un botón, el código alerta el factorial de un número que usted especifique. Ingrese un número negativo y se producirá un error. En este caso, Visual Studio detectará el error y resaltará la línea de código donde ocurrió el error y mostrará una pila de llamadas que incluye factorial y btnFactorial_click .

Este código también invoca factorial(-1) del controlador $ (documento) .ready. En este caso, Visual Studio mueve el resaltado al bloque finally en el siguiente código jQuery (extraído de jquery-1.6.1.js, comenzando en la línea 987

// resolve with given context and args resolveWith: function( context, args ) { if ( !cancelled && !fired && !firing ) { // make sure args are available (#8421) args = args || []; firing = 1; try { while( callbacks[ 0 ] ) { callbacks.shift().apply( context, args ); } } finally { fired = [ context, args ]; firing = 0; } } return this; },

Aunque la pila de llamadas no se muestra, Visual Studio muestra una ventana emergente que muestra el texto del error.

¿Cuál es el motivo de este comportamiento extraño y cómo puedo diseñar mi aplicación para que pueda atrapar fácilmente los errores que se originan en controladores como $ (documento) .Ready?


Probé tu pequeño ejemplo con el depurador de IE incorporado e informó el mensaje de excepción simplemente, colocando el cursor en el lanzamiento.

Lo mismo en Chrome.

Tengo jquery v1.6.2. Tal vez vale la pena una actualización?

Por otra parte, esto huele a un problema de enhebrado. Si siempre ocurre junto con una actualización de UI (como la alerta), podría ser que el depurador VS esté mirando un hilo del servidor de la interfaz de usuario cuando cree que está en el hilo js. En otras palabras, un error en el depurador. Si este es el caso, debe intentar con un depurador diferente para ver si el problema desaparece.


I''m having a problem debugging my web applications

¿Qué tipo de depurador estás usando? Tienden a variar y el mejor que he encontrado al desarrollar es el de Firefox debido a algunas herramientas integradas muy bonitas que tienen.

Aunque es bueno reproducir un problema, cuando no se puede reproducir en un simple ejemplo sucinto, la depuración se vuelve cada vez más importante. El establecimiento de puntos de interrupción y de ir línea por línea a veces es la única manera en lugar de esperar a que ocurra el error durante el tiempo de ejecución y luego volver a rastrear.

Hay varios enfoques descritos en este artículo de MSDN que podrían ser útiles para ayudar a resolver su problema. Estoy seguro de que has probado algunos de ellos, pero al menos vale la pena mirarlo, especialmente "Escenario 3: estoy recibiendo un error en el fondo de un conjunto de métodos de ayuda, y no estoy seguro de dónde se originó el error".

"Cómo depurar tu código jQuery"

http://msdn.microsoft.com/en-us/magazine/ee819093.aspx

Editar en respuesta a nuevos contenidos

jsfiddle de nuevo contenido: http://jsfiddle.net/EJbsS/

Cuando se ejecuta jsfiddle en cromo, se llama a la primera ejecución factorial (-1). Aparece un error Se puede acceder haciendo clic en la parte inferior derecha de la x roja, o inspeccionando el elemento, navegando a la pestaña de la consola y luego mirando el área de texto. El error dice "Error no detectado: la función factorial no admite números negativos", con un enlace a la línea exacta donde se utiliza el throw new Error() .

Tal vez necesito un poco más de aclaración, ¿cuál es el problema que estás tratando de resolver? Parece que Chrome depura este script muy bien. Quizás haya algunos problemas con el depurador de Visual Studio.

Además

Aquí hay una reproducción de una página de trabajo que se puede usar desde el bloc de notas guardado como .html

<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>demo</title> <script type=''text/javascript'' src=''http://code.jquery.com/jquery-1.6.4.js''></script> <script type=''text/javascript''>//<![CDATA[ $(window).load(function(){ $(document).ready(documentReady); function documentReady() { $(''#btnFactorial'').click(btnFactorial_click); factorial(-1); } function btnFactorial_click() { var x; x = prompt(''Enter a number to compute factorial for.'', ''''); alert(x + ''! = '' + factorial(x)); } function factorial(x) { if (x < 0) throw new Error(''factorial function doesn/'t support negative numbers''); else if (x === 0 || x === 1) return 1; else return factorial(x - 1) * x; } });//]]> </script> </head> <body> Factorial Page <input type=''button'' value=''Factorial'' id=''btnFactorial'' /> </body> </html>

Cuando ejecuta esta página en google chrome, navega a la pestaña de fuentes y establece un punto de interrupción en la Line 26: if (x < 0) la pila de llamadas completa se reproduce cuando se ejecuta la página, en el lado derecho.

factorial (debugpage.html:26) documentReady (debugpage.html:16) jQuery.extend._Deferred.deferred.resolveWith (jquery-1.6.4.js:1016) jQuery.extend._Deferred.deferred.done (jquery-1.6.4.js:1002) jQuery.fn.jQuery.ready (jquery-1.6.4.js:282) (anonymous function) (debugpage.html:11) jQuery.event.handle (jquery-1.6.4.js:3001) jQuery.event.add.elemData.handle.eventHandle (jquery-1.6.4.js:2635)

Aún más

Esperemos que esta advertencia sea la mejor hasta ahora. Buscando un poco en el seguimiento de la pila, encontré esto: console.trace(); . Es muy útil

Insértela en el código de arriba en la línea 26 como sigue:

if (x < 0) throw new Error(''factorial function doesn/'t support negative numbers''); else if (x === 0 || x === 1)

Se convierte

if (x < 0){ console.trace(); throw new Error(''factorial function doesn/'t support negative numbers''); }else if (x === 0 || x === 1)

Al ejecutarlo ahora, sin un punto de interrupción, se generará el seguimiento de la pila en la consola cuando se cumpla la condición de error:

console.trace() debugpage.html:27 factorial debugpage.html:27 documentReady debugpage.html:16 jQuery.extend._Deferred.deferred.resolveWith jquery-1.6.4.js:1016 jQuery.extend._Deferred.deferred.done jquery-1.6.4.js:1002 jQuery.fn.jQuery.ready jquery-1.6.4.js:282 (anonymous function) debugpage.html:11 jQuery.event.handle jquery-1.6.4.js:3001 jQuery.event.add.elemData.handle.eventHandle