Eu estou olhando para começar a fazer o meu JavaScript um pouco mais à prova de erro, e estou encontrando muita documentação sobre o uso try
, catch
, finally
, e throw
, mas eu não estou encontrando uma tonelada de conselhos de especialistas sobre quando e onde jogar erros.
- Todo código deve ser envolvido em uma tentativa / captura?
- Há mais conselhos como esse em que ponto os erros devem ser detectados?
- Existem desvantagens em gerar erros, em vez de o código falhar silenciosamente na produção?
- Isso foi abordado no SO em relação às implementações, mas os erros de JS do log do servidor são uma estratégia eficaz?
- Mais alguma coisa que eu deveria saber sobre erros de interceptação no meu aplicativo?
Também sou um jogo completo para ouvir livros que têm ótimos capítulos ou explicações detalhadas sobre como lidar com erros. O JavaScript eloquente aborda o assunto, mas não é muito prescritivo ou opinativo sobre o assunto.
Agradeço qualquer conselho que você possa dar!
javascript
error-handling
Joshua Cody
fonte
fonte
Respostas:
Um conjunto imensamente interessante de slides no Enterprise JavaScript Error Handling pode ser encontrado em http://www.devhands.com/2008/10/javascript-error-handling-and-general-best-practices/
Em resumo, resume:
Os slides entram em muito mais detalhes e provavelmente darão alguma orientação.
ATUALIZAR
A apresentação mencionada acima pode ser encontrada aqui: http://www.slideshare.net/nzakas/enterprise-javascript-error-handling-presentation
fonte
Nicholas Zakas, do Yahoo! fama fez uma palestra sobre Manipulação de Erros Corporativos ( slides ) no Ajax Experience 2008, na qual ele propôs algo assim:
Um ano depois, Nicholas Zakas postou uma atualização em seu blog, que incluía um padrão inteligente para injetar código de tratamento de erros automaticamente em seu ambiente de produção (usando programação orientada a aspectos).
Quando você começa a registrar as chamadas window.error, notará duas coisas:
Reduzir o torrent de entradas de log é tão simples quanto testar a gravidade e / ou um número aleatório antes de efetuar o logon no servidor:
O tratamento dos erros inúteis "window.error em undefined: 0" depende da arquitetura do site, mas pode tentar identificar todas as chamadas do Ajax e gerar uma exceção quando algo falhar (possivelmente retornando um rastreamento de pilha usando o stacktrace.js ).
fonte
if (global.logJSError) if (Math.random() < .01) logJSError('bootloader', {
(reconhecidamente que o código não acelerador todos os erros, apenas uma classe específica de erros de tempo limite)IHMO, você deve usar o tratamento de erros em javascript como em várias outras línguas (AFAIK: Python, Java).
Para melhor legibilidade (e provavelmente melhor desempenho, mesmo que eu não tenha certeza de que tenha um impacto muito grande), você deve usar o bloco try / catch principalmente nos seguintes casos:
A parte do código que você deseja quebrar é uma parte essencial de todo o algoritmo . Se falhar, poderá:
Você sabe que o código que está escrevendo não é compatível com todos os navegadores
Eventualmente, os especialistas em javascript podem ter outros elementos para fornecer.
meus 2 centavos para a caixa,
Saudações,
Máx.
fonte
Além das outras respostas: uma coisa importante é usar os dados de contexto disponíveis nos objetos de erro do JavaScript e nos
window.onerror
parâmetros da função.Coisas como o rastreamento de pilha (errorObject.stack), o nome do arquivo, o número da linha e o número da coluna. Observe que cada navegador tem algumas diferenças ... então faça o seu melhor para obter bons erros.
Pode até haver problemas com o próprio objeto do console . Eu uso uma função window.onerror personalizada inspirada neste e uma função especial para rastrear qualquer objeto de erro padrão inspirado nesse código .
Outro ponto positivo é incluir a versão do seu aplicativo da Web em algum lugar próximo ao rastreamento de pilha (para copiar e colar de maneira rápida e segura). Você também pode mostrar erros de forma mais agressiva (alerta ...) no modo de desenvolvimento, pois os desenvolvedores não monitoram constantemente o console do navegador e podem não ver alguns dos problemas.
Além disso, use evitar usar
throw 'My message'
, usarthrow new Error('My message')
, você pode até ter erros personalizados, leia este artigo .Sempre adicione algum contexto aos erros (a versão, o ID do objeto, alguma mensagem personalizada ...) e também faça uma distinção entre erros externos (alguns dados ou circunstâncias externas causaram falha no sistema) e erros internos / assertions (seu próprio sistema está estragado), leia sobre ' Design by contract '.
Aqui está um guia .
Pense também em usar o tratamento geral de erros, como interceptadores de suas bibliotecas e estruturas:
fonte