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:
nehmen, um sicherzustellen, dass korrektes Schließen oder Aufräumen stattfindet.
    Beachten Sie, dass
ensure
-Klauseln die Weitergabe von Ausnahmen verkomplizieren. In den obigen Ausführungen sind wir nicht auf
ensure
-Klauseln eingegangen. Wenn eine Ausnahme weitergegeben wird, springt sie nicht einfach auf magische Weise von der Stelle, wo sie ausgelöst wurde, zu der Stelle, wo sie behandelt wird. Es gibt wirklich einen Weitergabeprozess. Der Ruby-Interpreter durchsucht die umschließenden Blöcke von innen nach außen und den Call-Stack von unten nach oben. Bei jeder
begin
-Klausel sucht er nach einer
rescue
-Klausel, die die Ausnahme behandeln kann. Und er sucht nach verknüpften
ensure
-Klauseln und führt alle aus, die er auf dem Weg antrifft.
    Eine
ensure
-Klausel kann die Weitergabe einer Ausnahme abbrechen, indem sie irgendeine andere Übergabe der Kontrolle in Gang setzt. Wenn eine
ensure
-Klausel eine neue Ausnahme auslöst, wird diese Ausnahme anstelle der ursprünglichen weitergegeben. Wenn eine
ensure
-Klausel eine
return
-Anweisung enthält, dann endet die Weitergabe der Ausnahme, und die umschließende Methode kehrt zurück. Steueranweisungen wie
break
und
next
haben ähnliche Auswirkungen: Die Ausnahmeweitergabe wird abgebrochen und die angegebene Übertragung der Kontrolle findet statt.
    Eine
ensure
-Klausel verkompliziert auch das Konzept des Methodenrückgabewerts.
ensure
-Klauseln werden zwar im Allgemeinen verwendet, um sicherzustellen, dass Code auch dann ausgeführt wird, wenn eine Ausnahme auftritt, aber sie haben auch die Funktion, sicherzustellen, dass Code ausgeführt wird, bevor eine Methode zurückkehrt. Wenn der Rumpf einer
begin
-Anweisung eine
return
-Anweisung enthält, wird der Code in der
ensure
-Klausel ausgeführt, bevor die Methode tatsächlich zu ihrer aufrufenden Stelle zurückkehren kann. Darüber hinaus ändert eine
ensure
-Klausel den Rückgabewert der Methode, wenn sie eine eigene
return
-Anweisung enthält. Der folgende Code gibt beispielsweise den Wert 2 zurück:
begin
return 1 # Vor dem Rücksprung in die ensure-Klausel wechseln
ensure
return 2 # Den Rückgabewert durch diesen neuen Wert ersetzen
end
    Beachten Sie, dass eine
ensure
-Klausel den Rückgabewert einer Methode nicht ändert, wenn sie nicht explizit eine
return
-Anweisung verwendet. Die folgende Methode gibt beispielsweise
1
zurück, nicht
2
:
def test
begin return 1 ensure 2 end
end
    Wenn eine
begin
-Anweisung keine Ausnahme weitergibt, ist der Wert der Anweisung der Wert des letzten Ausdrucks in der
begin
-,
rescue
- oder
else
-Klausel. Der Code in der
ensure
-Klausel wird garantiert ausgeführt, beeinflusst aber nicht den Wert der
begin
-Anweisung.
    5.6.6 rescue mit Methoden-, Klassen- und Moduldefinitionen
    Im Lauf dieser Ausführungen über Ausnahmebehandlung haben wir die Schlüsselwörter
rescue
,
else
und
ensure
als Klauseln einer
begin
-Anweisung beschrieben. Eigentlich können sie auch als Klauseln der Anweisungen
def
(definiert eine Methode),
class
(definiert eine Klasse) und
module
(definiert ein Modul) verwendet werden. Methodendefinitionen werden in Kapitel 6 behandelt, Klassen- und Moduldefinitionen in Kapitel 7 .
    Der folgende Code ist eine Kurzübersicht über eine Methodendefinition mit
rescue
-,
else
- und
ensure
-Klauseln:
def method_name(x)
# Der Rumpf der Methode kommt hierhin.
# Normalerweise wird der Methodenrumpf ohne Ausnahmen bis
# zum Ende ausgeführt und kehrt normal zur aufrufenden Stelle
# zurück.
rescue
# Ausnahmebehandlungscode kommt hierhin.
# Wenn im Rumpf der Methode eine Ausnahme ausgelöst wird
# oder wenn eine der von ihr aufgerufenen Methoden eine Aus-
# nahme auslöst, dann springt die Kontrolle in diesen Block.
else
# Wenn im Rumpf der Methode keine Ausnahmen auftreten,
# wird der Code in dieser Klausel ausgeführt.
ensure
# Der Code in dieser Klausel wird auf jeden Fall ausgeführt, egal,
# was im Rumpf der Methode geschieht. Er wird ausgeführt, wenn
# die Methode bis zum Ende durchläuft, wenn sie eine Ausnahme
# auslöst oder wenn sie eine return-Anweisung ausführt.
end
    5.6.7 rescue als Anweisungs-Modifier
    Zusätzlich zu seiner Verwendung als Klausel kann
rescue
auch als Anweisungs-Modifier verwendet werden. Auf jede Anweisung können das Schlüsselwort
rescue
und eine andere Anweisung folgen. Wenn die erste Anweisung eine Ausnahme auslöst, wird stattdessen die zweite Anweisung ausgeführt, zum Beispiel:
# Fakultät von x berechnen oder 0

Weitere Kostenlose Bücher