Estou usando o seguinte para obter o nome da função do chamador JavaScript:
var callerFunc = arguments.callee.caller.toString();
callerFuncName = (callerFunc.substring(callerFunc.indexOf("function") + 8, callerFunc.indexOf("(")) || "anoynmous")
Existe uma maneira de descobrir o número da linha a partir do qual o método foi chamado?
Além disso, existe uma maneira de obter o nome do arquivo JavaScript a partir do qual o método foi chamado? Ou o URL de origem?
javascript
Tal
fonte
fonte
Respostas:
Isso funciona para mim em chrome / QtWebView
fonte
var caller_line = (new Error).stack.split("\n")[4]
A solução de kangax introduz um escopo try..catch desnecessário. Se precisar acessar o número da linha de algo em JavaScript (desde que esteja usando Firefox ou Opera), basta acessar
(new Error).lineNumber
.fonte
Fiquei surpreso com o fato de a maioria dessas respostas presumir que você queria tratar um erro em vez de apenas gerar rastreamentos de depuração úteis para casos normais também.
Por exemplo, gosto de usar um
console.log
wrapper como este:Isso acaba imprimindo uma saída como a seguinte no meu console:
1462567104174 [getAllPosts@http://me.com/helper.js:362:9]
Consulte https://stackoverflow.com/a/27074218/ e também Um wrapper adequado para console.log com o número de linha correto?
fonte
Isso geralmente é alcançado lançando um erro do contexto atual; em seguida, analisando o objeto de erro para propriedades como
lineNumber
efileName
(que alguns navegadores têm)Não se esqueça de que a
callee.caller
propriedade está obsoleta (e nunca foi realmente na 3ª ed. ECMA em primeiro lugar).Lembre-se também de que a descompilação da função é especificada para ser dependente da implementação e, portanto, pode gerar resultados bastante inesperados. Eu escrevi sobre isso aqui e aqui .
fonte
callee.caller
.line
apenas quando ocorre um erro.Parece que estou meio atrasado :), mas a discussão é bem interessante, então ... aqui vai ... Supondo que você queira construir um manipulador de erros e esteja usando sua própria classe de manipulador de exceções como:
E você está agrupando seu código assim:
Muito provavelmente, você terá o manipulador de erros em um arquivo .js separado.
Você notará que no console de erro do firefox ou do Chrome o número da linha de código (e nome do arquivo) mostrado é a linha (arquivo) que lança a exceção 'Error' e não a exceção 'errorHandler' que você realmente deseja para fazer a depuração fácil. É ótimo lançar suas próprias exceções, mas em grandes projetos, localizá-las pode ser um problema, especialmente se elas tiverem mensagens semelhantes. Então, o que você pode fazer é passar uma referência a um objeto Error vazio real para o seu manipulador de erros, e essa referência conterá todas as informações que você deseja (por exemplo, no firefox você pode obter o nome do arquivo e o número da linha etc. ; no cromo, você obtém algo semelhante se ler a propriedade 'stack' da instância Error). Resumindo, você pode fazer algo assim:
Agora você pode obter o arquivo real e o número da linha que gerou a exceção personalizada.
fonte
O número da linha é na verdade algo estático, então se você quiser apenas para registro, pode ser pré-processado com algo como gulp. Eu escrevi um pequeno plugin gulp que faz exatamente isso:
Isso anexará o nome do arquivo e a linha a todos os logs do console.log, e assim
console.log(something)
seráconsole.log('filePath:fileNumber', something)
. A vantagem é que agora você pode concatear seus arquivos, transpilá-los ... e você ainda obterá a linhafonte
Sei que essa é uma pergunta antiga, mas agora existe um método chamado
console.trace("Message")
que mostrará o número da linha e a cadeia de chamadas de método que levaram ao log junto com a mensagem que você passou. Mais informações sobre truques de log de javascript estão disponíveis aqui no freecodecamp e nesta postagem do blog médiofonte
Se você quiser saber o número da linha para fins de depuração, ou apenas durante o desenvolvimento (por uma razão ou outra), você pode usar o Firebug (uma extensão do Firefox) e lançar uma exceção.
Editar :
Se você realmente precisa fazer isso na produção por algum motivo, pode pré-processar seus arquivos javascript para que cada função acompanhe a linha em que está. Eu sei que alguns frameworks que encontram a cobertura de código usam isso (como JSCoverage ).
Por exemplo, digamos que sua chamada original seja:
Você pode escrever um pré-processador para torná-lo:
Em seguida
y()
, você pode usararguments.callee.caller.line
para saber a linha de onde foi chamada, como:fonte
Aqui está o que escrevi com base nas informações encontradas neste fórum:
Isso faz parte de um MyDebugNamespace, Debug é aparentemente reservado e não funcionará como nome de namespace.
...
...
Como ligar:
Eu incluí duas funções com número variável de argumentos chamando esse código base em meu namespace para, opcionalmente, omitir mensagem ou erro nas chamadas.
Isso funciona bem com o Firefox, IE6 e Chrome relatando o fileName e lineNumber como indefinidos.
fonte
o código a seguir funciona para mim no Mozilla e no Chrome.
Sua função de log que mostra o nome do arquivo e a linha do chamador.
fonte
SyntaxError: function statement requires a name,log: function (arg) {
Minha contribuição para erros personalizados em JavaScript:
Em primeiro lugar, concordo com esse cara @BT em Herdar do objeto Error - onde está a propriedade da mensagem? , temos que construí-lo corretamente (na verdade, você deve usar uma biblioteca de objetos js, minha favorita: https://github.com/jiem/my-class ):
então, devemos definir uma função global de tratamento de erros (opcional) ou eles acabarão no motor:
finalmente, devemos lançar nossos erros personalizados com cuidado:
Apenas, ao passar o terceiro parâmetro,
new Error()
podemos ver a pilha com os números de função e linha!Em 2, a função também pode manipular erros lançados pelo motor.
Claro, a verdadeira questão é se realmente precisamos e quando; há casos (99% na minha opinião) em que um retorno elegante de
false
é suficiente e deixa apenas alguns pontos críticos a serem mostrados com o lançamento de um erro.Exemplo: http://jsfiddle.net/centurianii/m2sQ3/1/
fonte
É assim que eu fiz, testei no Firefox e no Chrome. Isso torna possível verificar o nome do arquivo e o número da linha do local de onde a função é chamada.
fonte
Ele mostrará a pista inteira.
fonte
Para determinar em qual linha algo está, você deve pesquisar todo o código do código que ocupa a linha específica de interesse e contar os caracteres "\ n" do topo até a linha de interesse e adicionar 1.
Na verdade, estou fazendo exatamente isso em um aplicativo que estou escrevendo. É um validador de melhores práticas para HTML e ainda está em desenvolvimento, mas o processo de saída de erro no qual você estaria interessado está completo.
http://mailmarkup.org/htmlint/htmlint.html
fonte
As respostas são simples. Não e Não (Não).
No momento em que o javascript está rodando, o conceito de arquivos / urls de origem dos quais o vir já se foi.
Também não há como determinar um número de linha porque, novamente, no momento da execução, a noção de "linhas" de código não é mais significativa em Javascript.
Implementações específicas podem fornecer ganchos de API para permitir acesso de código privilegiado a tais detalhes para fins de depuração, mas essas APIs não são expostas ao código Javascript padrão comum.
fonte