2009-06-09 11 views
7

Cuando se produce un error de javascript en IE (o en otros navegadores) aparece una ventana emergente que indica que se ha producido un error de javascript; por lo general, viene con un número de línea y alguna pista. A veces viene con la línea 0 y no hay forma de saber cuál es el problema.en un error de javascript, cómo identificar el archivo de método o js con el problema?

Javscript puede provenir del propio HTML, de un archivo js o de JSP (y más). Microsoft tiene un depurador de scripts que ayuda mucho a encontrar dónde están los errores js, sin embargo, a veces, cuando se produce un error js, el depurador de scripts no puede encontrar la porción de código y por lo tanto es difícil encontrar cuál es la causa raíz del problema.

Mi pregunta es si alguien sabe alguna forma de hacer que el depurador de scripts encuentre el código de alguna manera (mayormente ocurre con el código js que está en el archivo JSP), o al menos incluir en el IE emergente el método o archivo js donde el error ha ocurrido. (solo muestra el número de línea, y muchas veces su línea 0 ...).

Gracias, Tal.

Respuesta

8

El objeto de error que se crea cuando JavaScript produce un error es muy poco confiable cuando se trata de la línea fuente, especialmente dentro de IE. Navegadores como Firefox y Safari son mejores en los números de línea, pero en general son inútiles debido a la minificación de los archivos.

Lo que evidentemente es más útil es obtener la pila de llamadas, pero debido a la naturaleza anónima de las funciones de JavaScript (bueno, que pueden ser anónimas) a menudo puede ser difícil calcular la cantidad de llamadas.

Si está haciendo un try/ catch puede hacer arguments.callee que le devolverá el método que llamó al método actual que falló.

He aquí un buen ejemplo de hacer una pila completa en JavaScript - http://eriwen.com/javascript/js-stack-trace/

+0

Gracias por eso, ¡este enlace es realmente útil! La pregunta es si tengo un montón de código sin try/catch y es simplemente un error js, ¿hay alguna manera fácil de saber qué sucedió? obteniendo rastro de pila? 10x – Tal

+1

La mejor manera sería adjuntar su propia función al evento window.onerror. Este evento se produce cuando ocurre una excepción no controlada. El enlace muestra cómo escribir un stacktracer por completo. Mi libro JS está trabajando actualmente, así que no puedo escribir más de un ejemplo yo mismo –

+0

gracias, adjuntar a este evento provocará que todos los errores js activen la función, ¿no puede esto tener implicaciones de rendimiento? ¿Es posible tener solo una porción del código monitoreado por excepciones? – Tal

1

Firebug en Firefox generalmente se considera una de las mejores herramientas de depuración.

En Firefox, vaya a

http://getfirebug.com

conseguirlo.

0

Si usa Firefox puede presionar Ctrl + Shift + J para que aparezca la consola de error de JavaScript que está integrada en Firefox, que le dirá exactamente qué salió mal.

2

Hay una versión de Firebug llamada Firebug Lite que funcione con Internet Explorer. Su rendimiento se basará en la complejidad de sus páginas; sin embargo, para páginas relativamente livianas, debería proporcionar alguna información.

Recomiendo esta herramienta en lugar de simplemente usar Firebug y Firefox porque no todos los errores que ocurren en Internet Explorer ocurrirán en Firefox, por lo que realizar cualquier depuración en ese navegador puede no dar ningún resultado.

+1

+1 para una herramienta que funciona en IE, -1 para recomendar esto * over * firebug – annakata

+0

buena herramienta, sin embargo, agregará este firebug lite js a la respuesta que se agregará a la red ... – Tal

0

Esto le imprima un seguimiento de pila:

function Stack() 
{ 
    try 
    { 
      throw Error() 
    } 
    catch(ex) 
    { 
    return ex.stack 
    } 
}; 

print(Stack()); 
0

Si todo lo demás falla (y cuando se trata de IE a veces lo hace) que siempre puede recorrer su código con alertas. Es crudo y tedioso, pero a veces es todo lo que puede hacer: Simplemente :

var count = 0; 

continuación, espolvorear un poco:

alert(count++); 

en las líneas estratégicas a lo largo de su código y tenga en cuenta en el que deja de alertar.

enjuague de enjuague repita hasta que tenga su línea.

Cuestiones relacionadas