Stack Trace para JavaScript

Os erros em JavaScript podem frequentemente ser crípticos e fatais. Combinado com retornos de chamada, assíncrono e funções comuns, encontrar a causa raiz pode ser um inferno.

Melhor tratamento de erros pode ser alcançado usando a chamada .stack em um erro dentro do bloco catch de uma função. Todos os erros podem ser capturados criando uma função chamada window.onerror .

Por exemplo:

body onload="func()">
<div id="error"></div>
<div id="error2"></div>
</body>

<script type="text/javascript">

function func()
{
try
{
var abc;
console
.log(abc.doesnt_exist)
}
catch (error)
{
document
.getElementById('error').innerText = error.stack;
}

abc
.doesnt_exist
}

window
.onerror = function(message, url, linenumber)
{
document
.getElementById('error2').innerText = "JavaScript error: " + message + " on line " + linenumber + " for " + url;
}

</script>

O código é executado no carregamento e foi projetado propositadamente para falhar. Isso falhará em dois lugares ao chamar o método .doesnt_exist , que é um método sem definição. Um dentro do bloco try … catch , que preencherá a primeira mensagem de erro, e outro sem, que será capturado pelo window.onerror .

TypeError: Cannot read property 'doesnt_exist' of undefined
at func
(file:///Z:/Teddy/websites/Echovoice%20Sandbox/javascript%20stack%20trace/stack.html:22:18)
at onload
(file:///Z:/Teddy/websites/Echovoice%20Sandbox/javascript%20stack%20trace/stack.html:7:108)
JavaScript error: Uncaught TypeError: Cannot read property 'doesnt_exist' of undefined on line 29 for file:///Z:/Teddy/websites/Echovoice%20Sandbox/javascript%20stack%20trace/stack.html

A saída mostrará o número da linha e as chamadas de função para cada método.