errors javascript firefox google-chrome error-handling

javascript capture errors



Cryptic "Script Error." Reportado en Javascript en Chrome y Firefox (13)

Tengo un script que detecta errores de Javascript en mi sitio web y los envía a mi back-end para generar informes. Informa el primer error encontrado, el supuesto número de línea y la hora.

EDIT para incluir doctype:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" xmlns:fb="http://www.facebook.com/2008/fbml">

...

<script type="text/javascript"> //<![CDATA[ // for debugging javascript! (function(window){ window.onerror = function(msg, url, ln) { //transform errors if (typeof(msg) === ''object'' && msg.srcElement && msg.target) { if(msg.srcElement == ''[object HTMLScriptElement]'' && msg.target == ''[object HTMLScriptElement]''){ msg = ''Error loading script''; }else{ msg = ''Event Error - target:'' + msg.target + '' srcElement:'' + msg.srcElement; } } msg = msg.toString(); //ignore errors if(msg.indexOf("Location.toString") > -1){ return; } if(msg.indexOf("Error loading script") > -1){ return; } //report errors window.onerror = function(){}; (new Image()).src = "/jserror.php?msg=" + encodeURIComponent(msg) + "&url=" + encodeURIComponent(url || document.location.toString().replace(/#.*$/, "")) + "&ln=" + parseInt(ln || 0) + "&r=" + (+new Date()); }; })(window); //]]> </script>

Debido a este script, soy muy consciente de cualquier error de javascript que esté sucediendo en mi sitio. Uno de los mayores delincuentes es "Error de secuencia de comandos". en la línea 0. en Chrome 10+ y Firefox 3+. Este error no existe (¿o se puede llamar algo más?) En Internet Explorer.

Corrección (5/23/2013): Este error de "Error de secuencia de comandos, línea 0" ahora se muestra en IE7 y posiblemente en otras versiones de IE. Posiblemente como resultado de un parche de seguridad reciente de IE, ya que este comportamiento no existía anteriormente.

¿Alguien tiene alguna idea de lo que significa este error o qué lo causa? Sucede en aproximadamente el 0,25% de mis cargas de página generales, y representa la mitad de los errores informados.


¿Qué tal el de abajo? El error de secuencia de comandos no está disponible a través de JavaScript, así que solo aísle ese caso en particular y trátelo lo mejor que pueda.

window.onerror = function (msg, url, lineNo, columnNo, error) { var string = msg.toLowerCase(); var substring = "script error"; if (string.indexOf(substring) > -1){ alert(''Script Error: See Browser Console for Detail''); } else { alert(msg, url, lineNo, columnNo, error); } return false; };


Debido al bajo porcentaje, puede suponer que no son usuarios normales. Probablemente los usuarios con libretas de usuarios, bookmarklets o incluso tal vez simplemente jugando con la consola en su sitio web. Tener todo el HTML de una página donde sucede podría ayudar a probar esta teoría. Además del error completo. Debería darle una url, ¿es siempre lo mismo? ¿La línea es realmente 0 o simplemente indefinida?

No creo que establecer valores predeterminados en ti onerror es una buena idea y el 0 probablemente proviene de parseInt(ln || 0) cuando el error no está realmente en la página (ver ejemplos más arriba).

Agregar un if para ver si la línea se conoce en JavaScript para ignorar esos errores (porque probablemente no provienen de su propio código) o en el código del lado del servidor para encargarse de ellos por separado, sería mejor .

=== EDIT === Tengo que: http://www.xavierm02.net/AZE/ Instalar el archivo user.js (lo hice en Chrome, pero debería funcionar también en Firefox). Luego abre la página html en el mismo navegador. Le mostrará el error (solo cambié ese insteal de informar al servidor, lo escribe en la página). Con 0 como número de línea.


El "error de secuencia de comandos". sucede en Firefox, Safari y Chrome cuando una excepción infringe la política de origen del mismo navegador, es decir, cuando el error se produce en un script alojado en un dominio que no sea el dominio de la página actual.

Este comportamiento es intencional, para evitar que los scripts pierdan información en dominios externos. Para ver un ejemplo de por qué es necesario, imagine accidentalmente visitar evilsite.com , que sirve una página con <script src="yourbank.com/index.html"> . (Sí, estamos señalando esa etiqueta de script en html, no en JS). Esto dará como resultado un error de script, pero el error es interesante porque nos puede decir si ha iniciado sesión o no. Si ha iniciado sesión, el error podría ser ''Welcome Fred...'' is undefined , mientras que si no lo está podría ser ''Please Login ...'' is undefined . Algo en esa línea.

Si evilsite.com hace esto para las 20 principales instituciones bancarias, ellos tendrían una muy buena idea de qué sitios bancarios visitarás, y podrían proporcionar una página de phishing mucho más específica. (Este es solo un ejemplo, por supuesto. Pero ilustra por qué los navegadores no deberían permitir que ningún dato traspase los límites del dominio).

He probado esto en las últimas versiones de Safari, Chrome y Firefox; todos hacen esto. IE9 no: trata las excepciones de origen x lo mismo que las de origen mismo. (Y Opera no admite onerror).

De la boca de los caballos: fuente de WebKit que comprueba el origen al pasar excepciones a onerror (). Y la fuente de Firefox que verifica .

ACTUALIZACIÓN (21/10/11) : El error de Firefox que rastrea este problema incluye un enlace a la publicación del blog que inspiró este comportamiento.

ACTUALIZACIÓN (12/2/14) : ahora puede habilitar el informe de error completo entre dominios en algunos navegadores especificando un atributo crossorigin en las etiquetas de scripts y haciendo que el servidor envíe los encabezados de respuesta HTTP CORS apropiados.


En Chrome, también recibo "Error de script" (en la línea 0) al cargar tanto el HTML como Javascript desde el file:// . Esto no ocurre en Firefox. Probablemente la protección del mismo origen demasiado celosa de Chrome.

Todo es bueno cuando se carga el mismo HTML y Javascript a través de HTTP.


Este tomó bastante para descubrirlo.

Hicimos muchas cosas para tratar de resolverlo, incluso hacer cosas como devolver el cuerpo del documento ENTERO a nuestros servidores a través de Ajax para tratar de resolverlo.

Todavía no estoy seguro de qué causa "Error de secuencia de comandos". (con el período BTW, así es como aparece en nuestro registrador Ajax) en Firefox, pero en Chrome, pudimos reducirlo a ...

Tambor de rollo ...

La función de traducción automática de Google Chrome.

Muchas personas de habla inglesa probablemente ni siquiera conocen esta función, pero para probarla, supongo que visitar un sitio que no esté en inglés con Chrome. O mejor aún, si exploras las opciones de Chrome, hay un lugar para cambiar el idioma del navegador. Cámbielo a algo que no sea inglés, reinicie el navegador y visite un sitio en inglés.

Debería obtener el listón en la parte superior preguntándole si desea que Chrome traduzca la página por usted.

En nuestro caso, de todos modos, el traductor estaba causando el problema ya que inyecta una etiqueta de script en el cuerpo del documento y (adivinar aquí) usa algún tipo de sistema basado en JS para enviar el contenido a los servidores de Google y lograr que lo traduzcan.

Aunque el error en la consola no se refirió a algo, el mensaje que se enviaba a window.onerror fue "Error de script".

De todos modos, hay una cura.

http://googlewebmastercentral.blogspot.com/2007/12/answering-more-popular-picks-meta-tags.html

<meta name="google" content="notranslate"/>

Esto hará 2 cosas (por lo que sabemos, ¿quizás más?):

a) Desactiva la barra de traducción para que no aparezca en Chrome.

b) Deshabilite la traducción de la página a través de translate.google.com.

En nuestra situación de todos modos, esto resolvió UNA TONELADA de estos "errores de guiones". problemas que estábamos experimentando.

Disculpe los errores de ortografía en esta publicación, todavía estoy en un modo no inglés en Chrome escribiendo esto, y el corrector ortográfico no está configurado en inglés;) Es hora de volver atrás.

¡Disfrutar!


He experimentado

Error de guión. línea 0

Durante un tiempo, se informaron errores a nuestro servidor cuando se produjo el error en los navegadores de los clientes. Ayer, por primera vez (después de introducir "use strict"; en nuestro javascript), pude replicar este problema en Safari y Chrome en Windows 7. Después de ensuciar nuestro código con las declaraciones de alerta () rastreé este error hasta el uso de una variable indefinida! por ejemplo, xx = 123; donde xx no está definido con una declaración var .

Safari informó esto como

ReferenceError: el modo estricto prohíbe la creación implícita de la propiedad global ''xx''

dentro de Web Inspector, pero la función window.onerror estaba detectando

Error de guión. línea 0


He hecho un poco de búsqueda y parece que un "Error de secuencia de comandos" significa que tuvo problemas para cargar un archivo que se le pidió que buscara. Esto podría ser un problema de almacenamiento en caché en el lado del cliente, o podría ser un problema del servidor debido a la sobrecarga.

Lo más probable es que sea causado por algo como esto, donde el script en sí es el archivo que no puede cargarse, de ahí el error que ocurre en la línea 0.

<script type="text/javascript" src="somescript.js"></script>


Intenté solucionar este problema.

Hermes.js que es un sistema de error de registro que tenía el mismo problema.

Después de investigar un tiempo, realicé una solución que puede ayudarte con la política de dominio cruzado ''Error de secuencia de comandos'' sobre scripts en diferentes dominios.

Llamé a CORSET y puedes verlo here cómo funciona.


La ampliación del código fuente de Firefox revela que no hay un "Script Error." . Por lo tanto, es muy probable que algún script en su sitio arroje un error no detectado como este:

throw new Error(''Script Error.'');

Probablemente esta afirmación solo se alcance en Firefox y Chrome.

Sin embargo, no estoy seguro de por qué no hay un número de línea. Tal vez algún problema eval() ?


Te diré lo que me solucionó en Safari (WebKit): si pongo la rutina de devolución de llamada de JS en la página , obtengo información completa. Si lo incluyo en un archivo .js mediante una etiqueta, obtengo el error "Error de script" (sin número de lienzo, etc.).

Quizás esto esté relacionado con lo que dijo Broofa.

Anwyay, así que ahora tengo una pequeña devolución de llamada en la página, y luego el resto del archivo fuera de la página.


Tuve un problema similar: mis scripts son servidos por un subdominio y caen bajo la misma restricción de origen. Sin embargo, resolví esto por:

1) agregar cada etiqueta de script de esta manera:

<script type="text/javascript" src="http://subdomain.mydomain.tld" crossorigin="*.mydomain.tld" />

2) modificar el httpd.conf de apache añadiendo lo siguiente dentro de cada vhost (debe poder acoplar mod_headers):

<IfModule mod_headers.c> Header add Access-Control-Allow-Origin "*.mydomain.tld" </IfModule>

Espero que esto ayude ...

EDITAR

En uno de mi servidor no pude hacer que esto fuera funcional excepto reemplazando

*.mydomain.tld

por

*

Tenga en cuenta las fallas que potencialmente le permiten phishing a la información extendida. La documentación en CORS, same-origin, img & fonts, cdn está disponible, pero hay muy pocos datos sobre los detalles de crossorigin de las etiquetas script disponibles.



Una actualización para aquellos que tropezarán con esta pregunta en el futuro: Broofa está en lo cierto con la respuesta y no hay ninguna solución para esto.

Obviamente, otros tropezaron con esta limitación y algunos errores que solicitaban una solución se archivaron para Firefox: Bug 69301 y para WebKit: Bug 70574

La buena noticia es que el error se resolvió para Firefox con el lanzamiento de Firefox 13. Así es como lo usas:

<script src="http://somremotesite.example/script.js" crossorigin>

crossorigin es equivalente a crossorigin=anonymous y le dice al navegador que haga una búsqueda CORS del script sin enviar credenciales.

Debe asegurarse de que la secuencia de comandos se envíe con un valor de encabezado HTTP Access-Control-Allow-Origin que coincida con el dominio solicitante, por ejemplo,

Access-Control-Allow-Origin: http://myhomesite.example Access-Control-Allow-Origin: *

de lo contrario, el navegador cancelará la carga del script .

Para Apache:

Header set Access-Control-Allow-Origin "*"

(Y vea ejemplos de CORS para otros servidores web ).

Si está enviando scripts en PHP:

header(''Access-Control-Allow-Origin'', ''http://myhomesite.example'');

He probado esto y funciona como se esperaba. todos los errores de script.js serán atrapados por el manejador window.onerror con los detalles de mensaje, archivo y línea.

El error de WebKit no se ha corregido aún, pero se ha propuesto un parche (y usa la misma solución). Con suerte, la solución se lanzará pronto.

Más información sobre CORS aquí: http://enable-cors.org/