Uso adequado de erros

155

Estou usando o TypeScript para um projeto razoavelmente grande e estou me perguntando qual é o padrão para o uso de Errors. Por exemplo, digamos que eu entregue uma exceção de índice fora dos limites em Java:

throw new IndexOutOfBoundsException();

A instrução equivalente no TypeScript seria:

throw new Error("Index Out of Bounds");

De que outras maneiras eu poderia conseguir isso? Qual é o padrão aceito?

Nathan Bellowe
fonte

Respostas:

167

Alguém postou este link no MDN em um comentário e acho que foi muito útil . Ele descreve coisas como ErrorTypes muito bem.

EvalError --- Cria uma instância representando um erro que ocorre em relação à função global eval ().

InternalError --- Cria uma instância que representa um erro que ocorre quando um erro interno no mecanismo JavaScript é lançado. Por exemplo, "muita recursão".

RangeError --- Cria uma instância que representa um erro que ocorre quando uma variável ou parâmetro numérico está fora do seu intervalo válido.

ReferenceError --- Cria uma instância representando um erro que ocorre ao remover a referência de uma referência inválida.

SyntaxError --- Cria uma instância representando um erro de sintaxe que ocorre ao analisar o código em eval ().

TypeError --- Cria uma instância representando um erro que ocorre quando uma variável ou parâmetro não é de um tipo válido.

URIError --- Cria uma instância representando um erro que ocorre quando encodeURI () ou decodeURI () passam parâmetros inválidos.

Nathan Bellowe
fonte
Parece estar faltando um tipo mais geral para argumento inválido . Nem todos os argumentos inválidos se enquadram RangeError. Você deve definir tipos personalizados ou apenas throw new Error("<message>");?
anddero 5/04
58

A convenção para fora do intervalo no JavaScript está em uso RangeError. Para verificar o tipo, use if / else + instanceofcomeçando do mais específico para o mais genérico

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}
basarat
fonte
2
Que tal um erro geral? E / ou onde está a lista de classes de erro JS embutidas?
Pitosalas
7
Há uma lista dos tipos de erros de JavaScript e outras informações no Mozilla Developer Network: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Christian Daven
6
@basarat Eu acho que você deve acrescentar else { throw; }aqui
knocte
43

Solução simples para emitir e mostrar mensagem por exceção.

try {
  throw new TypeError("Error message");
}
catch (e){
  console.log((<Error>e).message);//conversion to Error type
}

Cuidado

Acima não é uma solução se não soubermos que tipo de erro pode ser emitido do bloco. Nesses casos, devem ser utilizados protetores de tipo e o tratamento adequado para erros apropriados - consulte a resposta do @Moriarty.

Maciej Sikora
fonte
Obrigado pelo ponteiro para conversão de tipo explícita. Não encontrei essas informações no Typescript-Docs e aprendi alguma coisa hoje.
JackLeEmmerdeur
você sabe qual é o objetivo de adicionar <Error>? O e.message funciona bem para mim.
sbattou
1
@sbattou o único objetivo <Error>é dizer ao compilador TS que eaqui é do tipo <Error>para que você tenha (1) intellisense e (2) melhor verificação de tipo. Esteja ciente de que qualquer conversão não se traduz em JS e é um açúcar puramente sintático.
Didii 16/02/19
24

Não se esqueça das instruções do switch:

  • Garanta o manuseio com default.
  • instanceof pode corresponder na superclasse.
  • O ES6 constructorcorresponderá na classe exata.
  • Mais fácil de ler.

function handleError() {
    try {
        throw new RangeError();
    }
    catch (e) {
        switch (e.constructor) {
            case Error:      return console.log('generic');
            case RangeError: return console.log('range');
            default:         return console.log('unknown');
        }
    }
}

handleError();

Moriarty
fonte
3
Isso é ótimo; parece mais robusto e limpo do que as outras respostas.
Victor Zamanian