Richtige Verwendung von Fehlern

155

Ich verwende TypeScript für ein relativ großes Projekt und frage mich, was der Standard für die Verwendung von Errors ist. Angenommen, ich übergebe in Java einen Index außerhalb der Grenzen:

throw new IndexOutOfBoundsException();

Wäre die entsprechende Anweisung in TypeScript:

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

Welche anderen Möglichkeiten könnte ich dies erreichen? Was ist der akzeptierte Standard?

Nathan Bellowe
quelle

Antworten:

167

Jemand hat diesen Link zum MDN in einem Kommentar gepostet, und ich denke, er war sehr hilfreich . Es beschreibt Dinge wie ErrorTypes sehr gründlich.

EvalError --- Erstellt eine Instanz, die einen Fehler darstellt, der in Bezug auf die globale Funktion eval () auftritt.

InternalError --- Erstellt eine Instanz, die einen Fehler darstellt, der auftritt, wenn ein interner Fehler in der JavaScript-Engine ausgelöst wird. ZB "zu viel Rekursion".

RangeError --- Erstellt eine Instanz, die einen Fehler darstellt, der auftritt, wenn eine numerische Variable oder ein numerischer Parameter außerhalb ihres gültigen Bereichs liegt.

ReferenceError --- Erstellt eine Instanz, die einen Fehler darstellt, der beim Aufheben der Referenzierung einer ungültigen Referenz auftritt.

SyntaxError --- Erstellt eine Instanz, die einen Syntaxfehler darstellt, der beim Parsen von Code in eval () auftritt.

TypeError --- Erstellt eine Instanz, die einen Fehler darstellt, der auftritt, wenn eine Variable oder ein Parameter keinen gültigen Typ hat.

URIError --- Erstellt eine Instanz, die einen Fehler darstellt, der auftritt, wenn encodeURI () oder decodeURI () ungültige Parameter übergeben werden.

Nathan Bellowe
quelle
Es scheint ein allgemeinerer Typ für ungültige Argumente zu fehlen . Nicht alle ungültigen Argumente fallen unter RangeError. Sollten Sie benutzerdefinierte Typen definieren oder nur throw new Error("<message>");?
Anddero
58

Die Konvention für außerhalb des Bereichs in JavaScript wird verwendet RangeError. Um den Typ zu überprüfen, verwenden Sie if / else +, instanceofbeginnend mit dem spezifischsten bis dem allgemeinsten

try {
    throw new RangeError();
}
catch (e){
    if(e instanceof RangeError){
        console.log('out of range');
    }
}
Basarat
quelle
2
Was ist mit einem allgemeinen Fehler? Und / oder wo ist die Liste der eingebauten JS-Fehlerklassen?
Pitosalas
7
Es gibt eine Liste von JavaScript-Fehlertypen und anderen Informationen im Mozilla Developer Network: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Christian Davén
6
@basarat Ich denke, Sie sollten else { throw; }hier hinzufügen
knocte
43

Einfache Lösung zum Senden und Anzeigen von Nachrichten nach Ausnahme.

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

Vorsicht

Oben ist keine Lösung, wenn wir nicht wissen, welche Art von Fehler vom Block ausgegeben werden kann. In solchen Fällen sollten Typschutzvorrichtungen verwendet und eine ordnungsgemäße Behandlung für ordnungsgemäße Fehler durchgeführt werden. Schauen Sie sich die Antwort von @Moriarty an.

Maciej Sikora
quelle
Vielen Dank für den Hinweis auf die explizite Typkonvertierung. Ich habe diese Informationen nicht in den Typoskript-Dokumenten gefunden und heute etwas gelernt.
JackLeEmmerdeur
Wissen Sie, wozu das Hinzufügen von <Error> dient? e.message funktioniert gut für mich.
Sbattou
1
@sbattou Der einzige Zweck <Error>besteht darin, dem TS-Compiler mitzuteilen, dass ees sich um einen Typ handelt, <Error>damit Sie (1) Intellisense und (2) eine bessere Typprüfung haben. Beachten Sie jedoch, dass jede Besetzung überhaupt nicht in JS übersetzt wird und rein syntaktischer Zucker ist.
Didii
24

Vergessen Sie nicht die switch-Anweisungen:

  • Stellen Sie sicher, dass Sie mit handhaben default.
  • instanceof kann auf Superklasse passen.
  • ES6 entspricht constructorgenau der Klasse.
  • Einfacher zu lesen.

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
quelle
3
Das ist toll; scheint robuster und sauberer als die anderen Antworten.
Victor Zamanian