Obtenga el objeto de error de Javascript real con window.onerror


Javascript tiene esta gran devolución de llamada window.onerror. Es muy conveniente rastrear cualquier error. Sin embargo, llama con el nombre del error, el nombre del archivo y la línea. Ciertamente no es tan rico como obtener el objeto de error real de una instrucción try...catch. El objeto de error real contiene muchos más datos, así que estoy tratando de obtener eso. Desafortunadamente, la instrucción try...catch no funciona bien cuando comienza a tener código asincrónico.

Hay una manera de combinar y obtener lo mejor de ambos mundos? Inicialmente miré para una forma de obtener el último error activado dentro de un bloque onerror, pero parece que JS no almacena eso.

Alguna pista?

Author: Julien Genestoux, 2011-08-18

3 answers

Si se refiere a stack trace del objeto error, entonces AFAIK, esto no es posible.

La razón simple es que un seguimiento de pila está relacionado con un contexto de ejecución en el que las excepciones de tiempo de ejecución (se manejan con try...atrapar...finalmente) fueron creados o lanzados (con new Error() o throw).

Mientras que cuando se invoca window.onerror, se llama dentro de un contexto diferente.

Puede obtener cierto kilometraje inspeccionando window.event (no disponible en FF) en su controlador onerror.

 10
Author: Mrchief,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-17 20:52:10

Esto ahora es posible en algunos navegadores. La especificación se actualizó para incluir el error real con stacktrace como el 5to parámetro.

El problema es que no todos los navegadores admiten esto todavía, por lo que podría hacer algo como esto:

window.onerror = function(message, filename, lineno, colno, error)
{
    if(error != null)
    {
        //handle the error with stacktrace in error.stack
    }
    else
    {
        //sadly only 'message', 'filename' and 'lineno' work here
    }
};
 47
Author: Archaeron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-07 12:55:27

Los navegadores modernos soportan completamente la especificación del borrador HTML 5 para ErrorEvent y window.onerror. En ambos navegadores puede usar window.onerror, o (sorprendentemente!) enlace al evento' error ' correctamente:

// Only Chrome & Opera pass the error object.
window.onerror = function (message, file, line, col, error) {
    console.log(message, "from", error.stack);
};
// Only Chrome & Opera have an error attribute on the event.
window.addEventListener("error", function (e) {
    console.log(e.error.message, "from", e.error.stack);
});
 5
Author: Fizer Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-02 14:32:22