Como registar as excepções em JavaScript

como desenvolvedor de C# estou habituado ao seguinte estilo de tratamento de excepções:

try
{
    throw SomeException("hahahaha!");
}
catch (Exception ex)
{
    Log(ex.ToString());
}

Output
------

SomeNamespace.SomeException: hahahaha!
    at ConsoleApplication1.Main() in ConsoleApplication1\Program.cs:line 27
É muito simples, mas diz-me tudo o que preciso de saber sobre qual era a excepção e onde estava.

Como é que eu consigo a coisa equivalente em JavaScript onde o próprio objecto de excepção pode ser apenas uma cadeia de caracteres. Eu realmente quero ser capaz de saber a linha exata de código onde a exceção aconteceu, no entanto o seguinte código não regista nada útil em

try
{
    var WshShell = new ActiveXObject("WScript.Shell");
    return WshShell.RegRead("HKEY_LOCAL_MACHINE\\Some\\Invalid\\Location");
}
catch (ex)
{
    Log("Caught exception: " + ex);
}

Output
------

Caught exception: [object Error]

EDIT (novamente): só para esclarecer, isto é para aplicação interna que faz uso pesado de JavaScript. Eu estou atrás de uma maneira de extrair informações úteis de erros JavaScript que podem ser capturados no sistema de produção - Eu Já tenho um mecanismo de registro, só quero uma maneira de obter uma cadeia sensível para logar.

Author: Justin, 2009-08-06

6 answers

Você pode usar quase da mesma maneira ou seja.

try
{
    throw new Error("hahahaha!");
}
catch (e)
{
    alert(e.message)
}

Mas se quiser obter o número da linha e o nome do ficheiro onde o erro é jogado, suponho que não haja solução crossbrowser. Mensagem e nome são as únicas propriedades standart do objeto de erro. No mozilla você também tem propriedades de número de linha e nome de arquivo.

 5
Author: Eldar Djafarov, 2009-08-06 12:25:30

Você não especifica se você está trabalhando no navegador ou no servidor. Se for o primeiro, há um novo console .erro método e E. pilha propriedade:

try {
    // do some crazy stuff
} catch (e) {
    console.error(e, e.stack);
}
Por favor, tenha em mente que o erro funcionará no Firefox e no Chrome, mas não é padrão. Um exemplo rápido que irá descer para console.log e log e Se não existir e.stack:
try {
    // do some crazy stuff
} catch (e) {
    (console.error || console.log).call(console, e.stack || e);
}
 26
Author: Nacho Coloma, 2017-05-23 12:17:53
Sei que estou 4 anos atrasado para a festa, mas ainda senti a necessidade de adicionar os meus 2 cêntimos.

Como Eldar indica, você pode usar e. message para obter a mensagem da exceção. No entanto, em Chrome, Firefox e IE10+, você também pode obter o traço da pilha usando E. stack. O traço da pilha irá incluir o arquivo e número de linha da exceção.

Então para montar um texto com informação de exceção, você iria escrever algo como isto:

var exmsg = "";
if (e.message) {
    exmsg += e.message;
}
if (e.stack) {
    exmsg += ' | stack: ' + e.stack;
}

Note que você só vai ter uma pilha trace if

  1. a excepção foi lançada pelo navegador (como em resposta a uma erro de sintaxe);
  2. o objecto de excepção é um objecto de erro ou tem o objecto de erro como protótipo.
Então, só estou a atirar uma corda.!não te vou dar uma pista.

Para levar isto um pouco mais longe, para pegar todas as exceções não anotadas, você usaria uma janela.controlador de erro onerror (semelhante ao.Net Application_ controlador de erro no global.asax). A desvantagem desta utilização para ser (e principalmente ainda é) que isso não lhe daria acesso ao objeto de exceção real, então você não poderia obter o traço da pilha. Só receberia a mensagem, a url e o número da linha.

Recentemente, o padrão foi estendido para lhe dar a coluna (grande para os ficheiros minificados) e o objecto de excepção também: http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#errorevent

Neste momento (abril de 2014), apenas o Chrome 32 implementa tudo isto. IE10 + dá tu és a coluna, mas não o objecto de excepção. O Firefox 28 ainda só lhe dá a mensagem, url e número de linha. Esperemos que isto melhore em breve. Eu escrevi sobre isso para o projeto JSNLog, em: http://jsnlog.com/Documentation/GetStartedLogging/ExceptionLogging

(disclaimer: I am the author of JSNLog and jsnlog.com)

Em segundo lugar, o objecto de excepção.Net suporta excepções internas. Ele também tem uma propriedade de dados para que você possa anexar pares de valores chave com, por exemplo valores variáveis. Eu meio que perdi isso no objeto de erro JavaScript, então eu criei meu próprio objeto de exceção, também como parte do projeto JSNLog. Está no jsnlog.js file in the jsnlog.projecto js Github ( https://github.com/mperdeck/jsnlog.js).

A descrição está em: http://jsnlog.com/Documentation/JSNLogJs/Exception

Finalmente um 'plug' sem vergonha - o projecto JSNLog em que estou a trabalhar permite-lhe inserir madeireiros no seu JavaScript e insere automaticamente o registo mensagens no seu registo do lado do servidor existente. Assim, para registar as excepções de JavaScript com os seus traços de pilha para o registo do lado do Servidor, só precisa de escrever:

try {
    ...
} catch (e) {
    JL().fatalException("something went wrong!", e);
}
 18
Author: user1147862, 2014-04-30 10:38:24

Não tenho a certeza se é ou não um navegador cruzado ou se é o que procura, mas sugiro que tente:

window.onerror = function (err, file, line) {
    logError('The following error occurred: ' + 
    err + '\nIn file: ' + file + '\nOn line: ' + line);
    return true;
}
 2
Author: mahju, 2009-08-07 11:26:26

Você pode usar ferramentas de registo como Yahoo! Biblioteca UI-Logger para registar os erros/mensagens informativas.

 0
Author: Kirtan, 2009-08-06 10:19:40