Raku-Kurs / Objekte, Ein- und Ausgabe und Ausnahmen / Ausnahmen / Eigene Ausnahmen / Exercises / Ein Fehler bei negativen Zahlen
Lösung: Ein Fehler bei negativen Zahlen
Hier ist eine mögliche Lösung der Aufgabe.
Code
class Negative is Exception {
has $.n;
method message {
"$.n is negative";
}
}
sub check($n) {
Negative.new(n => $n).throw if $n < 0;
return $n;
}
{
say check(-5);
CATCH {
when Negative {
say .message;
}
}
}
Negative.new(n => -10).throw;🦋 Du findest den Quellcode in der Datei negative-error.raku.
Ausgabe
-5 is negative
-10 is negative
in block <unit> at negative-error.raku line 24Kommentare
Negative is Exceptionmacht die Klasse werfbar, und ihre Methodemessagebaut den Text aus dem Attributnauf.checkprüft seine Eingabe und wirft für eine negative Zahl die eigene Ausnahme. Die Ausnahme wandert auscheckhinaus zumCATCHim aufrufenden Block, wowhen Negativesie nach Typ trifft und die Meldung ausgibt. Eingaben zu prüfen und schlechte Werte mit einer typisierten Ausnahme zu melden ist eine sehr häufige, echte Verwendung eigener Ausnahmen.Die
{ … }um den Aufruf stehen dort, weil einCATCH-Phaser die Ausnahmen behandelt, die in seinem eigenen umgebenden Block geworfen werden. Der Block fasst das riskantecheck(-5)mit dem bewachendenCATCHzusammen, die geworfene Ausnahme wird also genau hier gefangen, und die Ausführung setzt gleich hinter dem Block fort. Ohne diese Klammerung würde dasCATCHstattdessen das ganze Programm bewachen — und sobald es die Ausnahme gefangen hätte, wäre das Programm schlicht zu Ende, ohne natürliche Stelle zum Weitermachen.Das abschließende
Negative.new(n => -10).throwzeigt die andere Seite. Es steht außerhalb des Blocks, nichts fängt es also: Die Ausnahme pflanzt sich bis ganz nach oben fort, und das Programm stirbt, gibt die Meldung samt Rückverfolgung auf der Standardfehlerausgabe aus und endet mit einem Status ungleich null. Das ist das Standardschicksal jeder Ausnahme, die Sie nicht fangen — und genau der Grund, warum der erste Wurf einCATCHbrauchte, um zu überleben.