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?

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.


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');
    }
}

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.


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


3
Das ist toll; scheint robuster und sauberer als die anderen Antworten.
Victor Zamanian
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.