Uso corretto degli errori


155

Sto usando TypeScript per un progetto abbastanza grande, e mi chiedo quale sia lo standard per l'uso di Errors. Ad esempio, supponiamo di consegnare un indice fuori dai limiti in Java:

throw new IndexOutOfBoundsException();

L'istruzione equivalente in TypeScript sarebbe:

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

In quali altri modi posso farlo? Qual è lo standard accettato?

Risposte:


167

Qualcuno ha pubblicato questo link alla MDN in un commento e penso che sia stato molto utile . Descrive cose come ErrorTypes molto accuratamente.

EvalError --- Crea un'istanza che rappresenta un errore che si verifica per quanto riguarda la funzione globale eval ().

InternalError --- Crea un'istanza che rappresenta un errore che si verifica quando viene generato un errore interno nel motore JavaScript. Ad esempio "troppa ricorsione".

RangeError --- Crea un'istanza che rappresenta un errore che si verifica quando una variabile numerica o un parametro è al di fuori del suo intervallo valido.

ReferenceError --- Crea un'istanza che rappresenta un errore che si verifica quando si fa riferimento a un riferimento non valido.

SyntaxError --- Crea un'istanza che rappresenta un errore di sintassi che si verifica durante l'analisi del codice in eval ().

TypeError --- Crea un'istanza che rappresenta un errore che si verifica quando una variabile o un parametro non è di tipo valido.

URIError --- Crea un'istanza che rappresenta un errore che si verifica quando encodeURI () o decodeURI () ricevono parametri non validi.


Sembra che manchi un tipo più generale per argomenti non validi . Non tutti gli argomenti non validi rientrano RangeError. Dovresti definire tipi personalizzati o semplicemente throw new Error("<message>");?
Anddero,

58

La convenzione per out of range in JavaScript sta usando RangeError. Per controllare il tipo usa if / else + a instanceofpartire dal più specifico al più generico

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}

2
Che dire di un errore generale? E / o dov'è l'elenco delle classi di errore JS integrate?
pitosalas,

7
C'è un elenco di tipi di errore JavaScript e altre informazioni nella rete di sviluppatori Mozilla: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Christian Davén,

6
@basarat Penso che dovresti aggiungere else { throw; }qui
knocte il

44

Soluzione semplice per emettere e mostrare messaggi per eccezione.

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

Attenzione

Sopra non è una soluzione se non sappiamo che tipo di errore può essere emesso dal blocco. In tali casi, è necessario utilizzare protezioni di tipo e maneggiare in modo corretto l'errore corretto. Dai un'occhiata alla risposta @Moriarty.


Grazie per il puntatore alla conversione esplicita del tipo. Non ho trovato queste informazioni in Typescript-Docs e ho imparato qualcosa oggi.
JackLeEmmerdeur

sai qual è lo scopo di aggiungere <errore>? e.message funziona bene per me.
sbattou,

1
@sbattou l'unico scopo <Error>è dire al compilatore TS che equi è di tipo in <Error>modo da avere (1) intellisense e (2) una migliore verifica del tipo. Attenzione però che qualsiasi cast non si traduce affatto in JS ed è puramente zucchero sintattico.
Didii,

25

Non dimenticare le istruzioni switch:

  • Garantire la gestione con default.
  • instanceof può abbinare su superclasse.
  • ES6 constructorcorrisponderà sulla classe esatta.
  • Più facile da leggere.

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();


3
Questo è fantastico; sembra più robusto e più pulito delle altre risposte.
Victor Zamanian,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.