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".La pila de llamadas se pierde cuando se lanza una excepción dentro de un manejador de jQuery
Tengo una página web con un controlador grande jQuery(document).ready()
. El problema es que cuando se lanza una excepción desde el controlador 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.
Siempre que intente reproducir este comportamiento con una pequeña página web, siempreobtener un puntero al código que lanzó la excepción, pero en el código de producción, nuncaconsigo el puntero de pila. Esto hace que la depuración sea más frustrante y propensa a errores.
¿Alguien aquí tiene alguna idea de qué podría estar causando este comportamiento y cómo hacerlo bien?
Actualización: Ya han pasado varios meses desde que he publicado esta pregunta y ahora creo que he reproducido de manera concluyente el tema. Reproduzco el tema con el código HTML siguiente:
<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>
Si examina el código, verá que cuando hace clic en un botón, el código de alerta al factorial de un número que 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 cursor sobre el bloque finally en el siguiente código de jQuery (extraído de jquery-1.6.1.js, comienza 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 no se muestra la pila de llamadas, Visual Studio muestra una ventana emergente que muestra el texto del error
¿Cuál es la razón 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 ?
+1 para Higgs-Bugson –
¿Podría publicar un ejemplo de código? – izb
@izb, el problema siempre aparece en mi código de producción (que no puedo publicar aquí), pero nunca aparece en el código de prueba que escribo para intentar aislar el problema. –