Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Scala Grundkurs

Exception Handling

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Eine möglichst umfassende Fehlerbehandlung gehört zu jeder guten Anwendung. Um mögliche Ausnahmesituationen und Fehlerausgaben in Ihrer Anwendung abzufangen, steht Ihnen in Scala die äußerst praktische Try-Syntax zur Verfügung.

Transkript

Nicht zuletzt sind Fehlermeldungen genau das, was das Entwicklerleben schwer machen. Schließlich programmiert man für Funktionen und nicht für Fehlerbehandlung. Nichtsdestotrotz gehört eine gute Fehlerbehandlung zu jeder guten Anwendung und eine Programmiersprache, die etwas auf sich hält, versucht die Problemstellung der Try-und-Catch-Semantik möglichst gut abzubilden. Scala versucht genau das und bietet hier eigene Mechanismen, die weitaus mächtiger sind als die Möglichkeiten, die man beispielsweise aus Java kennt. Und ich zeige Ihnen nun genau, wie. Ich befinde mich nun in meiner Anwendung. In dieser Anwendung gibt es also Kunden, ein Kundenkonto, hier signalisiert durch den "checkingAccount", einen Warenkorb, Produkte und einen Onlineshop, wo man diesen Warenkorb bestellen kann. Im Moment ist hier nicht viel von Fehlerbehandlung zu sehen. Wenn ich nun beispielsweise ein Stück von der IBAN entferne und die Anwendung ausführe, so erhalte ich also eine Fehlermeldung. Eine invalide IBAN wurde angegeben. Genau diese Art von Semantik möchte ich nun entsprechend innerhalb der Programmiersprache abbilden. Scala bietet hierfür die Funktion "Try". Diese wird importiert aus dem Paket "scala.util.Try" und ich definiere hier einen Block, innerhalb dessen der Code für den Try steht. Beispielsweise könnte ich nun den gesamten Prozess, in dem hier das Kundenkonto angelegt wird, als auch der Warenkorb, in einen solchen Try-Block schreiben. Als nächstes möchte ich nun, dass wenn genau das erfolgreich war, ich also einen Warenkorb erstellen konnte und meine Produkte in diesen Warenkorb hinzugefügt habe, dass genau nur dann der Check-out passieren soll. Das bedeutet, ich nehme nun das Objekt "checkout" und entferne es und stattdessen nutze ich die Möglichkeiten, den Warenkorb zu übergeben an den Check-out-Prozess. Damit der Warenkorb erfolgreich entsteht innerhalb meines Try-Blocks, muss ich diesen selbstverständlich als Return-Wert definieren. Verläuft das Ganze also positiv und es wird ein Basket ausgegeben aus diesem Try-Block, so wird das Ganze übergeben an meinen Check-out-Prozess. Aus einem solchen Try-Block entsteht ein besonderes Konstrukt. Ich füge nun also die Konstante "checkout" hinzu, die sich durch diesen Try-Block definiert. Auf ihr kann ich nun einiges feststellen. Zum Beispiel kann ich nun überprüfen, ob das Ganze erfolgreich war oder mit Fehlern verbunden war, hier signalisiert durch den Aufruf von "isSuccess" oder "isFailure". Wenn das Ganze also positiv verlaufen ist, genau dann möchte ich das "checkout"-Objekt erhalten. Dies tue ich mit einem Aufruf von "get" und dann bestätige ich letztendlich die Abbuchung beim Kunden. Sollte das Ganze nicht erfolgreich sein, hier nochmal explizit überprüft, signalisiere ich an der Stelle, dass der Check-out nicht erfolgreich war, und das beispielsweise anhand der Fehlermeldung, die dabei entstanden ist. Diese finde ich unter dem "checkout"-Objekt unter "failed" und rufe sie dann mit dem Aufruf von "get" ab. Man sieht also, ich konnte die Auswertung des Fehlerblocks möglichst weit nach hinten verschieben und dann eine korrekte Auswertung auf die Konsole schreiben. Damit habe ich also die völlige Kontrolle darüber, zu welchem Zeitpunkt meine Fehler ausgewertet werden und ich kann beispielsweise noch Logik, basierend auf den Zwischenergebnissen, aufbauen, wie in diesem Fall, dadurch, dass ich den Basket an den Check-out-Prozess übergebe, insofern er tatsächlich erstellt worden ist. Sollte in dem Prozess des Check-outs dann weiterhin ein Fehler entstehen, so würde sich auch dieser hier erst abbilden. Ist die IBAN nun korrekt, so funktioniert auch der Check-out-Prozess richtig. Mit solchen Try-Blöcken kann ich allerdings noch einiges mehr tun. Ich habe hier beispielsweise eine Payment-API implementiert. Diese ruft zwei Endpunkte im Internet auf, einen, der immer standardmäßig einen 500er-Error-Code zurückgibt und einen, der einen 200er-Statuscode zurückgibt. Innerhalb des Aufrufes der URL erhalte ich, wenn ich einen anderen Statuscode als 200 erhalte, eine Fehlermeldung, in dem Fall also "Server did not return 200". Diese API möchte ich nun also nutzen, um beispielsweise innerhalb des Bankkontos zu überprüfen, ob der Bezahlvorgang tatsächlich stattfinden kann. Begebe mich also in den "CheckingAccount". Und aktuell ist die Funktion "charge" so implementiert, dass sie standardmäßig immer einen Wert von "true" zurückgibt. Genau das möchte ich nun mit Hilfe von Try-Mechanismen abbilden. Ich erzeuge also wiederum einen Try-Block und innerhalb dieses Try-Blocks rufe ich nun die Payment-API auf, in dem Fall also die erste davon. Sollte das Ganze positiv verlaufen sein, so möchte ich, dass ein Wert von "true" resultiert, andernfalls ein Wert von "false". Beim Ausführen der Anwendung sehe ich also nun, dass die API nicht funktioniert, das heißt, dem Kunden konnte kein Geld abgebucht werden und dementsprechend ist der Prozess nicht erfolgreich. Tausche ich die Implementierung nun durch die zweite API, so ist der Vorgang erfolgreich und der Kunde hat das Geld abgebucht bekommen. Doch was ist, wenn ich nun beispielsweise zwei APIs habe und im Notfall nach der ersten API die zweite API nutzen möchte? Ich verwende also nun wieder die erste API und füge nun zusätzlich weitere Syntax hinzu mit Hilfe eines Aufrufs von "recover". Mit "recover" kann ich nun die Fehlermeldung abfangen. Diese ist also in Form eines Throwables und ich kann sie nun beispielsweise auf die Konsole ausgeben. Des Weiteren kann ich an der Stelle nun eine Alternative anbieten. Ich betitele das Ganze mit "Falling back to API2" und erstelle nun einen neuen Try-Block, innerhalb dessen ich nun die zweite API aufrufe. Wie Sie sehen können, führt der erste Aufruf zu einem Fehler. Das liegt daran, dass also nicht der Statuscode 200 vom Server geliefert wurde. Stattdessen nutzt meine Anwendung nun den Mechanismus von "recover" und nutzt die API2. Dadurch ist es also möglich, dass dem Kunden tatsächlich das Geld abgebucht wird. Gerade bei der Arbeit mit Webendpunkten finden sich Use Cases für diese Technologie in vielerlei Hinsicht. So wäre es beispielsweise auch möglich, auf dieser Basis, einen Retry-Mechanismus zu implementieren. Sie haben also nun die Möglichkeiten der Try-Funktion gesehen. Die Besonderheit hier war, dass die Fehlerbehandlung innerhalb eines Blocks stattfindet, den man auch als Closure bezeichnet. Der gesamte Code in diesem Closure wird also von der Semantik von Try geschützt und kann Fehler quasi nicht nach außen weitergeben. Diese befinden sich dann in einer Pipeline. Diese Pipeline kann man dann mit einer gemeinsamen Fehlerbehandlung korrekt behandeln. So ist es, wie gezeigt, auch beispielsweise möglich, mit Zwischenergebnissen zu arbeiten, unabhängig davon, ob der Code innerhalb des Try-Blocks erfolgreich war oder nicht.

Scala Grundkurs

Entdecken Sie die Möglichkeiten und Eigenschaften der modernen Programmiersprache Scala.

4 Std. 44 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Exklusiv für Abo-Kunden
Erscheinungsdatum:12.04.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!