JavaScript dispara um evento para exceções não atendidas/não capturadas?
-
19-08-2019 - |
Pergunta
Estou querendo registrar exceções de JavaScript não tratadas. Existe um evento que dispara quando uma exceção não é pega? Estou procurando capturar as exceções antes que elas causem erros de JavaScript no navegador, mas prefiro não executar todo o meu aplicativo dentro de uma tentativa/captura. Qualquer ajuda seria apreciada. Obrigado!
ATUALIZAÇÃO: TVANFOSSON apontou o OnError como uma possibilidade. Não faz parte de uma especificação e está disponível apenas nos navegadores baseados em IE ou lagartixas.
Para maiores informações - http://books.google.com/books?id=tkszhx-xkzyc&pg=pa386&lpg=pa386&dq=safari+onerror+javascript&s0aH3HOZ3HAHLOZ3HOZ3HOZ3HOZ3HAHLOZ3HOZ3HAHLOZ3HOZ3HAHLOZ3
Tabela de suporte do OnError - http://www.quirksmode.org/dom/events/error.html
Documentação de Mozilla - https://developer.mozilla.org/en/dom/window.onerror
Relatório de bugs do webkit - https://bugs.webkit.org/show_bug.cgi?id=8519
Solução
Tente usar um manipulador OnError. Documentos de mdn. Isso permitirá que você faça algo quando um erro for detectado, mas provavelmente não permitirá que você continue de uma maneira graciosa que um bloco de tentativa/captura o faria. Esteja ciente de que, sem dúvida, diferenças entre os navegadores na maneira como isso é tratado.
Outras dicas
Confira este violino:
window.onerror = function (msg, url, line) {
console.log("Caught[via window.onerror]: '" + msg + "' from " + url + ":" + line);
return true; // same as preventDefault
};
window.addEventListener('error', function (evt) {
console.log("Caught[via 'error' event]: '" + evt.message + "' from " + evt.filename + ":" + evt.lineno);
console.log(evt); // has srcElement / target / etc
evt.preventDefault();
});
throw new Error("Hewwo world. I crash you!!!");
throw new Error("Hewwo world. I can only crash you once... :(");
Quais impressões:
Caught[via window.onerror]: 'Uncaught Error: Hewwo world. I crash you!!!' from http://fiddle.jshell.net/xYsRA/1/show/:32 fiddle.jshell.net:21 Caught[via 'error' event]: 'Uncaught Error: Hewwo world. I crash you!!!' from http://fiddle.jshell.net/xYsRA/1/show/:32 fiddle.jshell.net:26 ErrorEvent {lineno: 32, filename: "http://fiddle.jshell.net/xYsRA/1/show/", message: "Uncaught Error: Hewwo world. I crash you!!!", clipboardData: undefined, cancelBubble: false…} fiddle.jshell.net:27\
Notas:
Se você remover as linhas "retornar verdadeiro" / "evt.preventDefault ()", depois que o erro for registrado, ele será impresso no console JS da maneira normal.
Ao contrário das declarações feitas acima, o Window.onerror trabalhou em todos os navegadores que testei. No entanto, o método AddEventListener provavelmente é melhor de qualquer maneira e fornece uma semântica mais rica.