Existe uma provisão para o bloco try-catch em javascript . Enquanto em java ou em qualquer outro idioma é obrigatório ter tratamento de erros, não vejo ninguém usando-os em javascript para maior extensão. Não é uma boa prática ou simplesmente não precisamos deles em javascript?
69
While in java or *any other language* it is mandatory to have error handling...
- Na verdade não. Java, sim, mas há muitas linguagens que não insistem em tentar pegar (como C #).Respostas:
Deve-se evitar
throw
erros como a maneira de transmitir condições de erro nos aplicativos.A
throw
declaração deve ser usada apenas "Para que isso nunca aconteça, bata e queime. Não se recupere de forma elegante"try catch
no entanto, é usado em situações em que objetos host ou ECMAScript podem gerar erros.Exemplo:
As recomendações na comunidade node.js são que você transmite erros nos retornos de chamada (porque os erros ocorrem apenas para operações assíncronas) como o primeiro argumento
Também há outros problemas, como o try / catch é muito caro e é feio e simplesmente não funciona com operações assíncronas.
Portanto, como as operações síncronas não devem gerar um erro e não funcionam com operações assíncronas, ninguém usa try catch, exceto os erros gerados pelos objetos host ou pelo ECMAScript
fonte
Error
, mas são poucas e distantes entre si.document.getElementById
, não lança quando o elemento não existe, apenas retornanull
. O mesmo pode feito por quase todos os casosA tentativa / captura no Javascript não é tão à prova de balas quanto em outros idiomas, devido à natureza assíncrona do Javascript. Considere este trecho:
O problema é que o fluxo de controle sai do
try
bloco antes dedo_something_that_throws()
ser executado, para que o erro gerado dentro do retorno de chamada nunca seja detectado.Portanto, try / catch é basicamente inadequado em muitos casos, e nem sempre é óbvio se algo executa código de forma assíncrona ou não. Felizmente, o javascript com seu idioma peculiar de retorno de chamada assíncrono com thread único e seu suporte para fechamentos reais fornece uma alternativa elegante: tratamento de erros no estilo de passagem de continuação. Basta passar a resposta adequada a qualquer erro como uma função, por exemplo:
fonte
Muitas dessas respostas são um pouco antigas e não levam em conta os novos recursos
async
e do ES7await
.Usando
async
/await
agora você pode obter um fluxo de controle assíncrono como desejar:Saiba mais sobre
async
/await
aqui . Você pode usarasync
/await
agora usando babel .fonte
try-catch em javascript é tão válido e útil quanto em qualquer outro idioma que os implemente. Há um motivo principal para não ser usado tanto em javascript quanto em outros idiomas. É o mesmo motivo pelo qual o javascript é visto como uma linguagem de script feia, o mesmo motivo pelo qual as pessoas pensam que os programadores de javascript não são programadores de verdade:
O simples fato de tantas pessoas serem expostas ao javascript (em virtude do único idioma suportado pelos navegadores) significa que você tem muitos códigos não profissionais por aí. Claro que também existem muitos motivos menores:
catch
capazes (coisas assíncronas)Independentemente disso, o try-catch deve ser usado, mas é claro que você deve aprender como usá-los adequadamente - como tudo na programação.
fonte
Acredito que muito do motivo
try..catch
raro no JavaScript seja porque a linguagem tem uma tolerância bastante alta a erros. A grande maioria das situações pode ser tratada usando verificações de código, bons padrões e eventos assíncronos. Em alguns casos, o simples uso de um padrão evitará problemas:Alguns dos principais problemas em outros idiomas que causam exceções simplesmente não existem no JS. A conversão de tipos não é necessária na grande maioria das vezes. Em vez disso, o método preferido é tipicamente apresentar a verificação (aplicando uma interface específica):
Com a adição de
async
/await
para o idioma,try..catch
está se tornando mais prevalente. Promete ser a forma assíncrona detry..catch
, faz sentido que se deva esperar:para ser escrito como:
fonte
Possivelmente, outro motivo pelo qual o try / catch não é muito usado no Javascript é que o construto não estava disponível nas primeiras versões do Javascript ... foi adicionado mais tarde.
Como resultado, alguns navegadores mais antigos não são compatíveis. (Na verdade, isso pode causar um erro de analisador / sintaxe em alguns navegadores antigos, algo mais difícil de "programar defensivamente" do que a maioria dos outros tipos de erros.)
Mais importante, como não estava disponível inicialmente, as funções internas do Javascript que foram lançadas inicialmente (o que se chamaria de funções de "biblioteca" em muitos idiomas) não a utilizam. (Ele não funciona muito bem para "capturar" um erro de someobject.somefunction () se não "dispara", mas apenas retorna "nulo" quando encontra um problema.)
Outro motivo possível é que o mecanismo try / catch não parecia necessário inicialmente (e ainda não parece tão útil). É realmente necessário apenas quando as chamadas são aninhadas rotineiramente em vários níveis; apenas devolver algum tipo de ERRNO funcionaria bem para chamadas diretas (embora para torná-lo realmente útil sempre que disponível, a melhor prática na maioria dos idiomas é usá-lo em qualquer lugar, em vez de apenas em chamadas profundamente aninhadas). Como originalmente se esperava que a lógica Javascript fosse pequena e simples (afinal, é apenas um complemento de uma página da web :-), não se esperava que as chamadas de função estivessem profundamente aninhadas e, portanto, um mecanismo de tentativa / captura não parecia necessário.
fonte
Acredito que eles não são muito utilizados, porque lançar exceções no código do lado do cliente Javascript torna mais difícil a depuração de uma página.
Em vez de lançar exceções, geralmente prefiro mostrar todas as caixas de alerta (ou seja
alert("Error, invalid...");
)Pode parecer estranho, mas erros de Javascript acontecem no lado do cliente, se um cliente estiver usando uma página que você construiu e a página lança uma exceção, a menos que o cliente seja um codificador experiente em tecnologia, não há como ele saber você qual é o problema.
Ele só ligará para você dizendo: "Ei, a página X não funciona!", E então tudo depende de você descobrir o que deu errado e onde está no código.
Ao usar a caixa de alerta, é mais provável que ele ligue e diga algo como: "Ei, quando clico no botão A da página X, ele mostra uma caixa que diz ..." , confie em mim, será muito mais fácil encontrar O inseto.
fonte