JavaScript suporta try/catch/finally
mas o objeto de Erro utiliza funciona de forma diferente de Exceções em outros idiomas e não fornece uma maneira de pegar Erros de tipo da mesma maneira que você pode, com Exceções em Java ou C# por isso é bastante comum para todos os Erros jogado em um projeto para ser instâncias de Erro.
alguns fornecedores implementaram uma cláusula condicional de captura, mas não é um padrão e não é amplamente suportado em navegadores.,
como resultado de não ter uma maneira padrão de definir erros — ou devolvê-los ao jogá-los de um servidor para um cliente-informações sobre um erro sendo retornado é muitas vezes perdido, com projetos com manipulação de erros sob medida.
jogando erros em outras línguas
Se você já usou. net / Mono você pode apreciar o quão bom o comportamento de manipulação de erros está fora da caixa, especialmente para os serviços web.se você não está familiarizado com a pilha. net/Mono bare comigo aqui por um minuto, nós estaremos voltando a como é relevante abaixo.
Convenções de nomeação
.,NET possui as convenções de nomenclatura para erros, como InputValidationException
para erros de validação de entrada e SecurityException
para erros de permissões, o que é ótimo para incentivar a consistência no tratamento de erros.
erros de serialização
outra grande característica do. NET é que lançar uma exceção no servidor em um serviço web automaticamente pode lançar essa exceção em um cliente usando o serviço-se o cliente é C#, Java, PHP ou JavaScript.,
Isto é possível graças à Web Services Description Language (WSDL), que define como os objetos, incluindo Exceções, são serializados e tem suporte nativo em alguns idiomas (incluindo C# e PHP) e apoio através de bibliotecas de terceiros em outros países (incluindo Java e JavaScript).
benefícios de ter uma convenção
o que é tão bom em ter convenções para erros é que torna mais fácil lidar bem com erros específicos porque eles têm tipos explícitos e consistentes.,
com tipos de erros pré-definidos, poderá decidir facilmente qual o detalhe que deseja devolver ao cliente (como os nomes dos campos que falharam na validação e o que se passou com eles), ao registar informações adicionais sobre a localização da pilha no servidor, quando forem despoletados erros inesperados.
Você também pode adicionar propriedades específicas a um erro, para tornar mais fácil destacar onde um problema está — como um campo de entrada com um valor inválido.
serialização é automática e consistente em toda uma aplicação, incluindo entre clientes e servidores., Isso torna mais fácil lidar com erros bem no lado do servidor e em uma interface de usuário.
definição de tipos de erro em JavaScript
JavaScript realmente tem vários tipos de erro core por padrão, mas eles são bastante nicho e de utilidade limitada para o tratamento de erros na maioria das aplicações.
no entanto, com o ES6 você pode estender a classe de erro e definir erros personalizados com o seu próprio comportamento — como erros de Registo automaticamente – e você pode escolher o detalhe a adicionar ou incluir ao retornar um erro.,
Você pode definir cada classe em um arquivo ou – se você tiver apenas um pequeno número de tipos de erro, o que é provavelmente o caso para a maioria dos projetos-você pode defini-los todos em um único arquivo como exportações nomeadas.
um exemplo de exportação de diferentes tipos de erros como as exportações nomeadas:
pode usar erros personalizados no seu código tal como faria com um erro normal:
Nota: Este exemplo é para o nó.js e utiliza “require”., Se você fosse escrever para ES6 no navegador (ou usando Babel para isomórficas código), você deve escrever a instrução include import { ValidationError } from './error'
Quando você joga um erro personalizado, você pode verificar que tipo é (e.g., observando o valor de .name
) e decidir como lidar com ele assim:
a Definição de uma name
propriedade, uma propriedade da classe de Erro no JavaScript, fornece uma maneira fácil de verificar o tipo de Erro se é serializado em um objeto padrão no RESTO chamada ou em uma socket serviço de chamada de retorno, assim, você pode lançar o Erro de todo o caminho até a pilha—por exemplo, a partir de um método interno, ao servidor web manipulador de rotas e todo o caminho para um navegador —e ainda saber o que aconteceu.,
Se você está retornando um erro de um DESCANSO ou soquete com base em serviço, o Erro geralmente será serialised em JSON e volta, e é susceptível de ser transformado em um simples objeto (e não mais um objeto de Erro) pelo tempo que o cliente avalia a resposta, mas a definição de tipos de erro como esta, em seus projetos ainda pode ajudar a fornecer uma convenção para o regresso e a verificação de erros.
devolvendo objetos de erro de promessas
você pode usar objetos de erro personalizados dentro de uma promessa também.,
é melhor evitar lançar erros de dentro de uma promessa, porque eles podem nem sempre ser capturados, dependendo de como o código que os chamou é estruturado.
no entanto, é uma boa prática retornar um erro ao rejeitar uma promessa, e você pode retornar erros tipos personalizados, assim como qualquer outro erro.
ao invocar a função, o seu catch()
cláusula pode então verificar para ver a resposta quando um erro é devolvido. Se você retornar uma instância de erro (ou uma classe que a estende) você terá um traço completo da pilha do erro que foi lançado.,
qualquer código que já estivesse usando esta função e que estivesse esperando um objeto de erro será compatível com um erro personalizado que estende a classe de erro padrão.
a serialização dos objectos de erro em JSON
por omissão, os objectos de erro são seralizados para JSON com resultados como este:
{ name: 'ValidationError' }
Esta saída não é particularmente útil se quiser passar os erros directamente para uma interface web a partir de uma estrutura como o Express ou Socket.IO.,
Pode substituir o método de serialização para devolver uma resposta diferente:
Este exemplo devolve a resposta encapsulada numa propriedade chamada ‘erro’, tornando mais fácil verificar as respostas. Ele seralizes JSON como este:
{
error: {
name: 'ValidationError',
message: 'A validation error',
stacktrace: '…'
}
}
Se você tiver vários tipos de erro, você pode querer criar o seu próprio personalizado classe de erro que se estende de Erro e, em seguida, base de todas as suas erro aulas de fora dessa.,
usar códigos de estado HTTP é apropriado em serviços HTTP, mas ter um formato padrão para erros em JSON ainda é útil – especialmente em outros contextos, como respostas enviadas sobre uma conexão de socket.
Você pode não querer incluir um traço de pilha (com nomes de arquivos e números de linha) na produção, mas pode ser útil no desenvolvimento e teste e você pode usar um condicional para que eles só são devolvidos no desenvolvimento.,
Resumo
seguindo uma sugestão de como o tratamento de erros funciona em outras linguagens como Java e C# e a definição de Erros personalizados com métodos padrão para seralizing-los requer não requer muito código para implementar e fornece uma consistente e facilmente compreensível convenção a seguir.o estabelecimento de boas Convenções de tratamento de erros num projecto pode tornar mais fácil melhorar a experiência do utilizador do seu software, eliminar mensagens misteriosas de ‘erro desconhecido’, localizar as causas de um comportamento inesperado e facilitar o registo, monitorização e comunicação de erros.