7 Fehler-Handling
Unser Ziel ist es sauberen Code zuschreiben, aber auch gleichzeitig die Anwendung vor Abstützungen zu schützen. Genau dafür ist das Fehler-Handling zuständig. Wir werden dafür Ausnahmen benutzen, statt nur das Ergebnis des Fehlers zurück zugeben und dieses Ergebnis mit mehreren If-Abfragen zu prüfen. Das Prüfen mit mehreren If-Abfragen führt zu unnötigen Fehlern und zusätzlichen unnötigen Code, besser sind Ausnahmen. Die Geschäftslogik ist dadurch besser vom Fehler-Handlin getrennt und der Code ist dadurch viel sauberer.
Try-Catch-Blöcke definieren für sich einen eigenen geschlossenen Bereich im Code. Ein Entwickler sollte immer mit Try-Catch-Anweisungen arbeiten, da beim Auftreten eines Fehlers im Try-Block der Fehler im Catch-Block gefangen wird. Als erstes sollte ein Entwickler immer Tests schreiben, dabei sollte der Entwickler dort schon ausnahmen berücksichtigen. Denn Tests mit Ausnahmen helfen den Entwickler schon möglichst früh Fehler abzufangen. Der Entwickler baut so Stück für Stück seinen Try-Block auf und kann gleichzeitig beim finden eines Fehlers den passenden Catch-Block hinzufügen. So baut der Entwickler das Fehler-Handling ganz genau auf und trennt dieses von der Geschäftslogik.
Sie sollten als Entwickler keine Unchecked Exceptions bei Methoden werfen, da Sie bei jeder weiteren Methode die throw-Klausel hinzufügen müssten, wenn die Methode von einer anderen Methode aufgerufen wird. Sie als Entwickler müssen die den Fehler solange an einer höheren Methode weiterleitet bis ein passender Catch-Block für diesen Fehler ausgeführt wird. Gerade bei großen Systemen kann der Aufwand dafür Erheblich sein.
Wichtig ist das Sie als Entwickler immer die Fehlermeldungen sehr gut beschreiben, damit Sie als Entwickler immer die Quelle und den Ort des Fehlers wiederfinden, um diesen Fehler dann zu beheben. Sie sollten in den Fehlermeldungen folgende benötigte Informationen nennen den Stack-Trace, den Namen und den Typ der gescheiterten Operation. Mit diesen Informationen können sie sehr schnell den Fehler finden und diesen dann beheben.
Sie können auch Exception-Klassen definieren. Wenn Sie mehrere zusammengehörende Catch-Blöcke haben, dann können Sie diese zu einer Exception-Klasse zusammenfassen und das Objekt der Exception-Klasse ausführen. Sie übergeben dann alle Parameter dem Objekt. Das Objekt ruft die Konstruktor-Methode auf und in der Konstruktor-Methode werden die Parameter gesetzt, da sich dort die Geschäftslogik aus dem Try-Block befindet. Selbstverständlich ist dieser Code wieder in einem Try-Block drin und die zusammenhängenden Catch-Blöcke kommen nach dem Try-block. Jetzt muss man nur noch das Objekt in dem ursprünglichen Try-Block einfügen und noch eine Catch-anweisung, falls das Objekt nicht generiert wird. Durch eine Exception-Klasse können wir den Code besser zusammenfassen und der Code ist besser austauschbar. Die Exception-Klasse kann gut für fremde APIs genutzt werden, da man diese mit anderen APIs austauschen kann, wenn man eine neue API verwenden will.
Man sollte als Entwickler niemals zu viele Null-Objekte zurückgeben, da diese eventuell nicht alle abgefangen werden. Wir müssten diese als Entwickler dann auch abfangen, besser ist es wenn man ein Objekt zurückgibt, welches einen Spezialfall definiert oder man gibt eine Ausnahme zurück. Der Entwickler muss so nicht mehr so viele Null-Abfragen definieren oder man gibt eine leere List als Objekt zurück, durch dieses Vorgehen kann es nicht zu einer NullPointerException kommen und damit stürzt das Programm nicht ab.
Ein Entwickler sollte niemals eine Null als Parameter einer Methode übergeben, denn das kann zu einer NullPionterException führen. Der Entwickler kann stattdessen ein Objekt übergeben, welches diesen Spezialfall abfängt.