Captura de todas as exceções não tratadas de javascript

112

Estou tentando encontrar ou descobrir uma maneira de exibir em uma caixa de alerta todas as exceções de javascript não tratadas em um aplicativo. Eu gostaria que tudo isso fosse feito no lado do cliente, sem usar nenhum código do lado do servidor. Estou usando MVC3 como ambiente.

Tenho pesquisado nos últimos dias e não encontrei exatamente o que procuro.

Encontrei 2 maneiras abaixo que parecem ser quase o que estou procurando, exceto que essas maneiras são configuradas para que você tenha que passar um nome de função em um método personalizado para imprimir o rastreamento de pilha de todas as exceções não tratadas dentro daquele função específica. Estou procurando uma maneira de não ter que passar manualmente um nome de função para um método personalizado que imprime o rastreamento de pilha de todas as exceções não tratadas. Eu gostaria que esse método personalizado apenas 'escutasse' todas as exceções não tratadas em todo o aplicativo.

http://eriwen.com/javascript/js-stack-trace/

Também algo semelhante ao link anterior:

https://github.com/eriwen/javascript-stacktrace

Este é o código básico do segundo link acima que imprime o rastreamento de pilha de uma função javascript especificada:

instrumentFunction: function (context, functionName, callback) {
    context = context || window;
    var original = context[functionName];
    context[functionName] = function instrumented() {
        callback.call(this, printStackTrace().slice(4));
        return context[functionName]._instrumented.apply(this, arguments);
    };
    context[functionName]._instrumented = original;
}

function printStackTrace(options) {
    options = options || {
        guess: true
    };
    var ex = options.e || null,
        guess = !! options.guess;
    var p = new printStackTrace.implementation(),
        result = p.run(ex);
    return (guess) ? p.guessAnonymousFunctions(result) : result;
}

Então, para resumir, todos vocês sabem de alguma maneira de ter algum tipo de 'ouvinte' para ouvir todas as exceções não tratadas de javascript e depois imprimi-las na tela em uma caixa de alerta?

Obrigado! Jason

jre247
fonte
uma coisa ... por que você usaria uma caixa de alerta?!? você pode usar console.log (error_message) para ....
Mathlight
1
Eu acho que esta pergunta Pegar todos os erros de JS irá ajudá-lo
Pilgerstorfer Franz
Você provavelmente deveria dar uma olhada nesta pergunta: stackoverflow.com/questions/205688/…
Marcos

Respostas:

129

Você pode fazer isso usando o método window.onerror.

window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
    alert("Error occured: " + errorMsg);//or any message
    return false;
}
Nish
fonte
13
Muito melhor do que tentar agrupar todo o meu aplicativo em um bloco try / catch. :) Obrigado!
Anthony
15
Apenas um aviso: "Observe que alguns / muitos eventos de erro não acionam a janela. Onerror, você deve ouvi-los especificamente." - developer.mozilla.org/en-US/docs/Web/API/…
shusson
6
não há necessidade de incluir o nome da função (myErrorHandler) nesse código ... pode ser apenas função (errorMsg, url, lineNumber)
JoelFan
18
@JoelFan é melhor ter o nome da função, para fins de depuração. O depurador usará o nome da função em vez de mostrar como uma função anônima.
Jerinaw
Isso é incrível e obrigado! Tenho tentado depurar um script de zoom fotográfico complexo que funciona bem 100% do tempo, exceto no safai móvel, onde falha aleatoriamente e onde não há "console" ou janela de "desenvolvedor" para ver o que aconteceu. Claro que tenho minha própria janela de "depuração" que posso ativar com um botão secreto, mas não tenho como ver globalmente todos os erros que não fiz em 'try / catch on. Essa adição me mostrou EXATAMENTE onde estava o problema e me poupou de arrancar mais cabelo! Gostaria de poder votar duas vezes!
Randy
48

Você pode usar window.onerrorou (surpreendentemente!) Vincular ao evento 'erro' corretamente:

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

Se quiser rastrear erros de JavaScript, experimente o Atatus . Eu trabalho na Atatus.

Fizer Khan
fonte
7
por que você está "retornando falsa" declaração?
kumaresan_sd
@kumaresan_sd permite que o manipulador de eventos padrão seja acionado: developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Jens Bodal
29

Além de

window.onerror = function (message, file, line, col, error) {
   alert("Error occurred: " + error.message);
   return false;
};
window.addEventListener("error", function (e) {
   alert("Error occurred: " + e.error.message);
   return false;
})

Você também pode capturar todos os erros disparados dentro de um callback de promessa ( .then()) ouvindo o unhandledrejectionevento

window.addEventListener('unhandledrejection', function (e) {
  alert("Error occurred: " + e.reason.message);
})
Javier Perez
fonte
1
É necessário usar ambos window.onerrore window.addEventListener("error", ou usar um deles é suficiente?
Tormod Haugene
2
Você pode usar um deles. Se você usar window.addEventListener("error", envie useCaptureset para a truefim de capturar também erros de elementos que não apareceram. developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/…
Javier Perez
1
Obrigado!! O errorevento não estava pegando meu erro particular. unhandledrejectionentendi embora.
joe
throw new Error('tja');não é pego no último cromo com esta abordagem ...
OZZIE
1
@JavierPerez Eu testei usando o v80, atirei o evento e gerou um erro logo depois e não foi detectado, também não detectou erros de sintaxe.
OZZIE
1

Confira http://log4javascript.org ele é baseado no Log4J. Se a maior parte do seu código for empacotado em instruções try / catch para lidar com exceções, você pode usar esta biblioteca como uma interface comum para enviar saída para uma "caixa de diálogo" sempre disponível ou janela de registro que seu usuário final pode ver. Você poderia até ter um botão que executa um window.print () para imprimir o conteúdo da caixa de diálogo na impressora ou PDF. Boa sorte.

Robert Bolton
fonte