errors - Obtenga el objeto de error de Javascript real con window.onerror
onerror javascript (3)
Javascript tiene esta gran window.onerror
devolución de window.onerror
. Es bastante 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 declaración try...catch
. El objeto de error real contiene muchos más datos, así que estoy tratando de conseguirlo. Desafortunadamente, try...catch
statement no funciona bien cuando comienzas a tener un código asíncrono.
¿Hay alguna manera de combinar y obtener lo mejor de ambos mundos? Inicialmente busqué una forma de obtener el último error desencadenado dentro de un bloque onerror
, pero parece que JS no almacena eso.
¿Cualquier pista?
Los navegadores modernos son totalmente compatibles con las especificaciones de borrador de HTML 5 para ErrorEvent y window.onerror
. En ambos navegadores puedes usar window.onerror o (increíblemente) enlazar 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);
});
Si se refiere al rastro de pila del objeto de 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 se crearon o lanzaron excepciones de tiempo de ejecución (manejadas con try ... catch ... finally) (con new Error()
o throw
).
Mientras que cuando se invoca window.onerror
, se llama dentro de un contexto diferente.
Puede obtener un poco de kilometraje inspeccionando window.event
(no disponible en FF) en su controlador onerror
.
esto ahora es posible en algunos navegadores. La spec se actualizó para incluir el error real con stacktrace como el quinto parámetro.
el problema es que no todos los navegadores lo admiten todavía, por lo que podrías 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
}
};