javascript - errors - sentry window onerror




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

¿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;
};

https://code.i-harness.com

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.


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.


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 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.


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/





error-handling