Bereits im Beitrag zum Thema Fehleranalyse und Debuggen, kam in den Kommentaren das Thema try and catch auf. Was try and catch ist und wie man es verwendet, wird in diesem Blogeintrag thematisiert.
Was ist überhaupt dieses try and catch?
Je umfangreicher eure User Apps oder auch Javascriptanwendungen sind um so mehr Fehlerquellen kann und wird es geben. Eine Vielzahl der Fehler (auch Logikfehler) tauchen erst im späteren Leben einer User App oder Anwendung auf. Damit diese Fehler bei der Programmierung und später im Livebetrieb auffallen und schneller gefunden werden können, gibt es seit Javascript 4.1 wie auch in anderen Scriptsprachen den try-catch-Block und kann dementsprechend auch „throw Exceptions“ sprich Ausnahmen werfen.
Wie ist denn so ein try-catch-Block aufgebaut?
try { // Hier kommt der Scriptbereich hin, der überprüft werden soll. } catch(e) { // Hier kommt die Fehlerbehandlung hin } finally { // Funktion, die auf jeden Fall durchgeführt werden soll. }
Im oben stehenden Beispiel werden mögliche Scriptfehler abgefangen. Exceptions treten auf, wenn ein Fehler während der Laufzeit auftritt. Mögliche Ursachen für eine Fehlerwarnung können unter anderem eine unbekannte Variable oder eine nicht unterstützte oder nicht exisitierende Methode sein. Diese Fehlerwarnungen können dann anschließend im catch-Bereich verarbeitet werden. Wenn Exceptions geworfen werden, werden alle Funktionen und Methoden im Try-Bereich nicht weiter durchgeführt. Da es aber immer Situationen geben kann, bei denen bestimmte Prozesse ausgeführt werden müssen, gibt es noch den finally-Bereich. Alle Methoden und Funktionen, die in diesem Bereich angegeben werden, werden immer durchgeführt. Dabei ist es egal ob Exceptions geworfen werden oder nicht.
Wann wird try and catch am ehesten verwendet?
Generell gibt es keinen fest definierten Anwendungsbereich, doch es macht Sinn sich entweder try-catch()-throw zu verwenden oder if-than-else. Hierbei ist es wichtig zu wissen, ob Fehler die abgefangen werden eher häufiger oder seltener eintreten oder ob sich euer Script sich selbstständig erholen kann.
Gerade, wenn euer Script sich von solchen Fehlern selbst erholen kann, ist es ratsam eher die if-than-else-Methode zu nutzen. Da diese Abfrage aber immer durchgeführt wird, ist sie performancetechnisch sehr teuer. Wenn der Fehler allerdings unter normalen Bedingungen nur selten auftritt, ist Exception-Handling effizienter, weil das Script unter normalen Bedingungen keine weiteren Prüfungen abhandelt. Für gravierende Fehler, die eine Ausnahme darstellen, ist try-catch()-throw gedacht.
Ich lese immer wieder throw… Was ist das?
Eure Scripts können Mithilfe von der Angabe throw auch eigene Exceptions werfen, die ihr selbst definiert habt. Die selbstdefinierte Exception kann entweder ein String, eine Zahl oder ein Objekt sein. Zum besseren Verständnis, folgt auch schon ein kleines Beispiel.
function myFunction() { var message, x; message = document.getElementById("message"); message.innerHTML = ""; x = document.getElementById("demo").value; try { if(x == "") throw "leer"; if(isNaN(x)) throw "keine Zahl"; x = Number(x); if(x < 5) throw "zu gering"; if(x > 10) throw "zu hoch"; } catch(err) { message.innerHTML = "Eingabe ist " + err; } }