Se eu mesmo lançar uma exceção JavaScript (por exemplo, throw "AArrggg"
), como posso obter o rastreamento de pilha (no Firebug ou não)? Agora eu só entendi a mensagem.
edit : Como muitas pessoas abaixo postaram, é possível obter um rastreamento de pilha para uma exceção JavaScript, mas eu quero obter um rastreamento de pilha para minhas exceções. Por exemplo:
function foo() {
bar(2);
}
function bar(n) {
if (n < 2)
throw "Oh no! 'n' is too small!"
bar(n-1);
}
Quando foo
é chamado, eu quero obter um rastreamento de pilha que inclui as chamadas para foo
, bar
, bar
.
javascript
stack-trace
David Wolever
fonte
fonte
throw 'arrrgh';
, e eles parecem iguaisthrow new Error('arrrgh');
.throw new Error('arrrgh');
No entanto, o depurador do Chrome ainda precisa conforme indicado (mas o Chrome parece fornecer rastreamentos muito mais detalhados).Respostas:
Edição 2 (2017):
Em todos os navegadores modernos, você pode simplesmente ligar para:
console.trace();
(Referência MDN)Edição 1 (2013):
Uma solução melhor (e mais simples), como apontado nos comentários sobre a pergunta original, é usar a
stack
propriedade de umError
objeto da seguinte maneira:Isso irá gerar uma saída como esta:
Fornecendo o nome da função de chamada junto com o URL, sua função de chamada e assim por diante.
Original (2009):
Uma versão modificada deste snippet pode ajudar um pouco:
fonte
caller
agora está obsoleto ecallee
foi removido do modo estrito do ES5. Aqui está o porquê stackoverflow.com/questions/103598/…Observe que o chromium / chrome (outros navegadores que usam a V8) e o Firefox possuem uma interface conveniente para obter um rastreamento de pilha através de uma propriedade de pilha nos objetos Erro .
Aplica-se às exceções de base e às que você mesmo lança. (Considere que você usa a classe Error, que é uma boa prática).
Veja detalhes na documentação da V8
fonte
.stack
propriedade.console.error(e.stack);
para que ele se parece com uma mensagem de exceção padrãoNo Firefox, parece que você não precisa lançar a exceção. É o suficiente para fazer
fonte
window.onerror
, mostra uma pilha quase vazia com apenas aonerror
função.console.log(new Error().stack)
> : (> :(> :(Se você possui o firebug, há uma opção de interrupção em todos os erros na guia script. Depois que o script atingir seu ponto de interrupção, você poderá olhar a janela da pilha do firebug:
fonte
Uma boa (e simples) solução, conforme apontado nos comentários da pergunta original, é usar a
stack
propriedade de umError
objeto da seguinte maneira:Isso irá gerar uma saída como esta:
Fornecendo o nome da função de chamada junto com o URL e o número da linha, sua função de chamada e assim por diante.
Eu tenho uma solução realmente elaborada e bonita que eu criei para um projeto no qual estou trabalhando atualmente e extraí e refiz um pouco para generalizar. Aqui está:
Confira no GitHub (atualmente v1.2)! Você pode usá-lo como ele
Console.debug("Whatever");
e, dependendo das configuraçõesConsole
, imprimirá a saída e um rastreamento de pilha (ou apenas informações simples / nada extra). Aqui está um exemplo:Certifique-se de brincar com as configurações do
Console
objeto! Você pode adicionar espaçamento entre as linhas do rastreamento e desativá-lo totalmente. Aqui está comConsole.trace
set parafalse
:Você pode até desativar o primeiro bit de informação mostrado (definido
Console.settings.debug.showInfo
comofalse
) ou desativar a depuração totalmente (definidoConsole.settings.debug.enabled
comofalse
) para nunca mais precisar comentar uma instrução de depuração! Apenas deixe-os entrar e isso não fará nada.fonte
Eu não acho que exista algo embutido que você possa usar, no entanto, encontrei muitos exemplos de pessoas criando suas próprias.
fonte
throw { name: 'NameOfException', message: 'He's dead, Jim' }
.Você pode acessar as propriedades
stack
(stacktrace
no Opera) de umaError
instância, mesmo que você a tenha lançado. O problema é que você precisa se certificar de que usathrow new Error(string)
(não esqueça o novo em vez dethrow string
.Exemplo:
fonte
Com o navegador Chrome, você pode usar o
console.trace
método: https://developer.chrome.com/devtools/docs/console-api#consoletraceobjectfonte
Isso fornecerá um rastreamento de pilha (como matriz de cadeias) para os modernos Chrome, Opera, Firefox e IE10 +
Uso:
Exclui da pilha sua própria chamada e o título "Erro" usado pelo Chrome e Firefox (mas não pelo IE).
Não deve travar em navegadores mais antigos, mas apenas retornar a matriz vazia. Se você precisar de uma solução mais universal, consulte stacktrace.js . Sua lista de navegadores suportados é realmente impressionante, mas, na minha opinião, é muito grande para a pequena tarefa a que se destina: 37 KB de texto minificado, incluindo todas as dependências.
fonte
Uma atualização para a resposta de Eugene: O objeto de erro deve ser lançado para que o IE (versões específicas?) Preencha a
stack
propriedade. O seguinte deve funcionar melhor que o exemplo atual e evitar retornarundefined
quando estiver no IE.Nota 1: Esse tipo de coisa deve ser feito apenas durante a depuração e desativado quando ativo, especialmente se chamado com freqüência. Nota 2: Isso pode não funcionar em todos os navegadores, mas parece funcionar no FF e no IE 11, o que atende perfeitamente às minhas necessidades.
fonte
Uma maneira de obter um rastreamento real da pilha no Firebug é criar um erro real, como chamar uma função indefinida:
Ou use
console.error()
seguido de umathrow
instrução, poisconsole.error()
mostra o rastreamento da pilha.fonte
Este código de polyfill funciona em navegadores modernos (2017) (IE11, Opera, Chrome, FireFox, Yandex):
Outras respostas:
não está funcionando no IE 11!
Usando argument.callee.caller - não funciona no modo estrito em nenhum navegador!
fonte
No Google Chrome (versão 19.0 e posterior), simplesmente lançar uma exceção funciona perfeitamente. Por exemplo:
mostrará o rastreamento da pilha na saída do console do navegador:
Espero que esta ajuda.
fonte
função:
caso de uso:
fonte
este script mostrará o erro
fonte
fonte
Meio atrasado para a festa, mas, eis uma outra solução, que detecta automaticamente se os argumentos.callee estão disponíveis e usa a nova pilha Error ()., Se não estiver. Testado em cromo, safari e firefox.
2 variantes - stackFN (n) fornece o nome da função n fora do chamador imediato, e stackArray () fornece uma matriz, stackArray () [0] sendo o chamador imediato.
Experimente em http://jsfiddle.net/qcP9y/6/
fonte
Você pode usar esta biblioteca http://www.stacktracejs.com/ . É muito bom
Da documentação
fonte
https://rawgithub.com/stacktracejs/stacktrace.js/master/stacktrace.js
é uma versão antiga, a mais nova versão estável (correspondente ao trecho de código) está aqui:https://raw.githubusercontent.com/stacktracejs/stacktrace.js/stable/stacktrace.js
Aqui está uma resposta que fornece desempenho máximo (IE 6+) e compatibilidade máxima. Compatível com IE 6!
fonte
É mais fácil obter um rastreamento de pilha no Firefox do que no IE, mas fundamentalmente, aqui está o que você deseja fazer:
Coloque o código "problemático" em um bloco try / catch:
Se você examinar o conteúdo do objeto "error", ele conterá os seguintes campos:
e.fileName: o arquivo / página de origem de origem do problema e.lineNumber: O número da linha no arquivo / página de origem do problema e.message: Uma mensagem simples descrevendo que tipo de erro ocorreu e.name: o tipo de erro que ocorreu, no exemplo acima, deve ser 'TypeError' e.stack: contém o rastreamento de pilha que causou a exceção
Espero que isso ajude você.
fonte
Eu tive que investigar uma recursão infinita no smartgwt com o IE11; portanto, para investigar mais profundamente, eu precisava de um rastreamento de pilha. O problema era que eu não conseguia usar o console de desenvolvimento, porque a reprodução era mais difícil dessa maneira.
Use o seguinte em um método javascript:
fonte
Uau - não vejo uma única pessoa em 6 anos, sugerindo que verifiquemos primeiro para ver se
stack
está disponível antes de usá-lo! A pior coisa que você pode fazer em um manipulador de erros é lançar um erro por chamar algo que não existe.Como outros já disseram, embora
stack
seja mais seguro usar agora, não é suportado no IE9 ou anterior.Registro meus erros inesperados e um rastreamento de pilha é bastante essencial. Para obter o máximo suporte, primeiro verifique se
Error.prototype.stack
existe e é uma função. Nesse caso, é seguro usá-loerror.stack
.Edit: Parece que uma vez que
stack
é uma propriedade e não um método, você pode chamá-lo com segurança, mesmo em navegadores mais antigos. Ainda estou confuso, porque tinha certeza de que a verificaçãoError.prototype
funcionou para mim anteriormente e agora não funciona - então não tenho certeza do que está acontecendo.fonte
Usando o
console.error(e.stack)
Firefox mostra apenas o rastreamento de pilha nos logs, o Chrome também mostra a mensagem. Isso pode ser uma grande surpresa se a mensagem contiver informações vitais. Sempre registre os dois.fonte
Apenas tente
Isso funciona muito bem para o chrome:
fonte