Bücher online kostenlos Kostenlos Online Lesen
Die Programmiersprache Ruby (German Edition)

Die Programmiersprache Ruby (German Edition)

Titel: Die Programmiersprache Ruby (German Edition) Kostenlos Bücher Online Lesen
Autoren: David Flanagan , Yukihiro Matsumoto
Vom Netzwerk:
Klauseln behandelten Ausnahmen behandelt, verwenden Sie
rescue Exception
als letzte
rescue
-Klausel.
    5.6.3.3 Weitergabe von Ausnahmen
    Nun, da wir die
rescue
-Klauseln vorgestellt haben, können wir die Weitergabe ( propagation ) von Ausnahmen detaillierter erklären. Wenn eine Ausnahme ausgelöst wird, wird die Kontrolle unmittelbar nach außen und nach oben weitergegeben, bis eine passende
rescue
-Klausel gefunden wird, um die Ausnahme zu behandeln. Wenn die Methode
raise
ausgeführt wird, überprüft der Ruby-Interpreter, ob mit dem umschließenden Block eine
rescue
-Klausel verknüpft ist. Falls nicht (oder falls die
rescue
-Klausel nicht so deklariert ist, dass sie diese Art von Ausnahme behandelt), schaut der Interpreter im umschließenden Block des umschließenden Blocks nach. Gibt es nirgendwo in der Methode, die
raise
aufgerufen hat, eine passende
rescue
-Klausel, wird die Methode selbst beendet.
    Wenn eine Methode aufgrund einer Ausnahme abgebrochen wird, ist das nicht dasselbe wie ein normales
return
. Die Methode hat keinen Rückgabewert, und das Ausnahmeobjekt wird von der Stelle des Methodenaufrufs aus weitergegeben. Die Ausnahme wandert weiter nach außen durch die umschließenden Blöcke, auf der Suche nach einer
rescue
-Klausel, die deklariert wurde, um sie zu behandeln. Und wenn keine derartige Klausel gefunden wird, kehrt diese Methode zurück zu ihrer aufrufenden Stelle. Das geht so weiter, den Call-Stack hinauf. Wenn nirgendwo ein Ausnahme-Handler gefunden wird, gibt der Ruby-Interpreter die Ausnahmemeldung und den Backtrace aus und beendet das Programm. Betrachten Sie für ein konkretes Beispiel den folgenden Code:
def explode # In 10% der Fälle wird ein RuntimeError ausgelöst.
raise "Peng!" if rand(10) == 0
end
def risky
begin # Dieser Block
    10.times do # enthält einen weiteren Block
     explode # der eine Ausnahme auslösen könnte.
    end # Keine rescue-Klausel hier; Weitergabe nach außen.
rescue TypeError # Diese Klausel behandelt keinen RuntimeError
    puts $! # also überspringen und nach außen weitergeben.
end
"hello" # Normaler Rückgabewert, falls keine Ausnahme auftritt.
end # Keine rescue-Klausel; weiter zur aufrufenden Stelle.
def defuse
begin # Der folgende Code kann mit Ausnahme scheitern.
    puts risky # Versuch, den Rückgabwert des Aufrufs auszugeben.
rescue RuntimeError => e # Bei Ausnahme
    puts e.message # stattdessen eine Fehlermeldung ausgeben.
end
end
defuse
    In der Methode
explode
wird eine Ausnahme ausgelöst. Diese Methode hat keine
rescue
-Klausel, so dass die Ausnahme an deren aufrufende Stelle weitergegeben wird, eine Methode namens
risky
.
risky
hat eine
rescue
-Klausel, aber die ist so deklariert, dass sie nur
TypeError
-Ausnahmen und keine
RuntimeError
-Ausnahmen behandelt. Die Ausnahme wird durch die lexikalischen Blöcke von
risky
nach außen weitergegeben und wandert schließlich hinauf zu deren aufrufender Stelle, einer Methode namens
defuse
.
defuse
hat eine
rescue
-Klausel für
RuntimeError
-Ausnahmen, so dass die Kontrolle an diese
rescue
-Klausel übertragen und die Ausnahme nicht mehr weitergegeben wird.
    Beachten Sie, dass dieser Code die Verwendung eines Iterators (die Methode
Integer.times
) mit einem verknüpften Block enthält. Aus Gründen der Einfachheit haben wir gesagt, dass die Ausnahme einfach nach außen durch diesen lexikalischen Block weitergegeben wird. Die Wahrheit ist, dass Blöcke sich aus der Sicht der Ausnahmenweitergabe eher wie Methodenaufrufe verhalten. Die Ausnahme wird vom Block hinauf zu dem Iterator weitergegeben, der den Block aufgerufen hat. Vordefinierte Schleifeniteratoren wie
Integer.times
führen keine eigene Ausnahmebehandlung durch, so dass die Ausnahme vom
times
-Iterator aus den Call-Stack hinauf zu der Methode
risky
wandert, die ihn aufgerufen hat.
    5.6.3.4 Ausnahmen während der Ausnahmebehandlung
    Wenn während der Ausführung einer
rescue
-Klausel eine Ausnahme auftritt, wird die Ausnahme, die ursprünglich behandelt werden sollte, verworfen, und die neue Ausnahme wird von der Stelle, an der sie aufgetreten ist, weitergegeben. Beachten Sie, dass diese neue Ausnahme nicht von
rescue
-Klauseln behandelt werden kann, die auf diejenige folgen, in der sie aufgetreten ist.
    5.6.3.5 retry in einer rescue-Klausel
    Wenn die
retry
-Anweisung innerhalb einer
rescue
-Klausel verwendet wird, führt sie den Codeblock, mit dem das
rescue
verknüpft ist, erneut aus. Wenn eine Ausnahme durch einen vorübergehenden Ausfall

Weitere Kostenlose Bücher