Raku-Kurs / Objekte, Ein- und Ausgabe und Ausnahmen / Ausnahmen
Weiche Fehler
Eine Ausnahme mit die zu werfen hält sofort alles an.
Manchmal ist das zu drastisch: Sie möchten, dass eine Subroutine meldet,
dass sie kein Ergebnis liefern konnte, die Entscheidung über die Schwere
aber dem Aufrufer überlassen. Dafür hat Raku weiche
Fehlschläge, erzeugt mit fail.
Wenn eine Subroutine fail aufruft, wirft sie nicht
sofort. Stattdessen liefert sie dem Aufrufer ein besonderes
Failure-Objekt. Ein Failure ist undefiniert,
der Aufrufer kann also in aller Ruhe darauf prüfen:
sub divide($a, $b) {
fail 'cannot divide by zero' if $b == 0;
return $a / $b;
}
say divide(10, 2); # 5
say divide(10, 0).defined; # FalseDer erfolgreiche Aufruf liefert 5. Der fehlschlagende
Aufruf liefert ein Failure, das für defined
False meldet, sodass der Aufrufer das Ergebnis prüfen kann,
bevor er es verwendet.
Ein Failure heißt weich, weil es sich erst dann
in eine echte, geworfene Ausnahme verwandelt, wenn Sie versuchen, es als
Wert zu verwenden, ohne es zuvor zu prüfen. Solange Sie es behandeln —
etwa indem Sie defined testen —, bleibt es still. So kann
eine Subroutine ein Problem melden, ohne das ganze Programm zum Anhalten
zu zwingen.
Das haben Sie schon einmal gesehen
Dieser aufgeschobene Stil des Fehlschlagens ist nicht auf
fail beschränkt. Früher in diesem Teil ist Ihnen dieselbe
Idee zweimal begegnet.
Eine Division durch null erzeugt still einen Wert und wirft erst, wenn Sie ihn tatsächlich verwenden:
my $x = 1 / 0; # no error yet
say $x; # throws only here, when the value is usedEin fehlschlagendes externes Programm liefert ein
Proc, das nur wirft, wenn Sie es unbehandelt verwerfen —
bewahren Sie es auf und sehen Sie es sich an, bleibt es ein stiller
Wert:
run 'sh', '-c', 'exit 1'; # the failing Proc is discarded, so this throwsIn jedem Fall hält ein Problem das Programm nicht in dem Moment an, in dem es auftritt: Es wird zu einem Wert, den Sie prüfen können, und eskaliert erst dann zu einer geworfenen Ausnahme, wenn Sie ihn ungeprüft verwenden oder ignorieren. Das Thema Nicht jeder Fehler tritt sofort auf stellt diese beiden nebeneinander.
Praxis
Lösen Sie 1 Quiz zum Inhalt dieses Themas.
Übungen
Dieser Abschnitt enthält 3 Übungen. Sehen Sie sich alle Themen dieses Abschnitts an, bevor Sie mit den Übungen beginnen.