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:
hervorgerufen wurde, etwa durch einen überlasteten Server, kann es sinnvoll sein, die Ausnahme einfach durch einen neuen Versuch zu behandeln. Viele andere Ausnahmen spiegeln dagegen Programmierfehler (
TypeError
,
ZeroDivisionError
) oder nicht vorübergehende Ausfälle (
EOFError
oder
NoMemoryError
) wider.
retry
ist kein geeignetes Verarbeitungsverfahren für diese Ausnahmen.
    Es folgt ein einfaches Beispiel, das
retry
für den Versuch verwendet, auf die Auflösung eines Netzwerkausfalls zu warten. Es versucht, den Inhalt einer URL zu lesen, und versucht es bei einem Fehlschlag erneut. Es versucht das nie öfter als viermal und verwendet einen exponentiellen Zeitabstand, um die Wartezeit zwischen den Versuchen zu erhöhen:
require 'open-uri'
tries = 0 # Wie oft haben wir versucht, die URL zu lesen
begin # Hier beginnt ein neuer Versuch
tries += 1 # Versuchen, den Inhalt einer URL auszugeben
open('http://www.example.com/') {|f| puts f.readlines }
rescue OpenURI::HTTPError => e # Bei einem HTTP-Fehler
puts e.message # Fehlermeldung ausgegeben
if (tries < 4) # Noch keine vier Versuche?
    sleep(2**tries) # 2, 4 oder 8 Sekunden warten
    retry # Und dann erneut versuchen!
end
end
    5.6.4 Die else-Klausel
    Eine
begin
-Anweisung kann nach ihren
rescue
-Klauseln eine
else
-Klausel enthalten. Sie könnten denken, dass die
else
-Klausel ein Catch-All-
rescue
wäre, das heißt, dass sie jede Ausnahme behandelt, die auf keine der vorherigen
rescue
-Klauseln passt. Aber dafür ist
else
nicht gedacht. Die
else
-Klausel ist eine Alternative zu den
rescue
-Klauseln; sie wird verwendet, wenn keine der
rescue
-Klauseln benötigt wird. Das heißt, der Code in einer
else
-Klausel wird ausgeführt, wenn der Code im Rumpf der
begin
-Anweisung ohne Ausnahmen bis zum Ende durchläuft.
    Code in eine
else
-Klausel zu schreiben ist fast dasselbe, wie diesen Code am Ende der
begin
-Klausel anzuhängen. Der einzige Unterschied bei der Verwendung einer
else
-Klausel besteht darin, dass jegliche von dieser Klausel ausgelösten Ausnahmen nicht durch die
rescue
-Anweisungen behandelt werden.
    Die Verwendung einer
else
-Klausel ist in Ruby nicht besonders verbreitet, aber sie kann stilistisch sinnvoll sein, um den Unterschied zwischen der normalen und der Ausnahme-Erledigung eines Codeblocks zu betonen.
    Beachten Sie, dass es keinen Sinn ergibt, eine
else
-Klausel ohne eine oder mehrere
rescue
-Klauseln zu verwenden. Der Ruby-Interpreter erlaubt es, gibt aber eine Warnung aus. Hinter einer
else
-Klausel darf keine
rescue
-Klausel mehr stehen.
    Beachten Sie schließlich, dass der Code in einer
else
-Klausel nur ausgeführt wird, wenn der Code in der
begin
-Klausel bis zum Ende durchläuft. Wenn eine Ausnahme auftritt, wird die
else
-Klausel natürlich nicht ausgeführt. Aber
break
,
return
,
next
und ähnliche Anweisungen in der
begin
-Klausel können auch die Ausführung der
else
-Klausel verhindern.
    5.6.5 Die ensure-Klausel
    Eine
begin
-Anweisung kann eine letzte Klausel haben. Die optionale
ensure
-Klausel muss, wenn sie verwendet wird, hinter allen
rescue
- und
else
-Klauseln stehen. Sie kann auch für sich allein ohne jegliche
ensure
- oder
else
-Klauseln verwendet werden.
    Die
ensure
-Klausel enthält Code, der immer ausgeführt wird, egal, was mit dem Code geschieht, der auf
begin
folgt:
    Wenn dieser Code bis zum Ende durchläuft, springt die Kontrolle zur
else
-Klausel – falls eine vorhanden ist – und dann zur
ensure
-Klausel.
Wenn der Code eine
return
-Anweisung ausführt, überspringt die Ausführung die
else
-Klausel und springt direkt zur
ensure
-Klausel, bevor sie zurückkehrt.
Wenn der auf
begin
folgende Code eine Ausnahme auslöst, springt die Kontrolle zur entsprechenden
rescue
-Klausel und dann zur
ensure
-Klausel.
Wenn es keine
rescue
-Klausel gibt oder keine
rescue
-Klausel diese Ausnahme behandeln kann, geht die Kontrolle direkt auf die
ensure
-Klausel über. Der Code in der
ensure
-Klausel wird ausgeführt, bevor die Ausnahme aus den umschließenden Blöcken heraus oder den Call-Stack hinauf weitergegeben wird.
    Der Zweck der
ensure
-Klausel besteht darin, sicherzustellen, dass Aufräumarbeiten wie das Schließen von Dateien, das Beenden von Datenbankverbindungen oder der Commit beziehungsweise Abbruch von Transaktionen korrekt durchgeführt werden. Sie ist eine mächtige Kontrollstruktur, und Sie sollten sie verwenden, wann immer Sie eine Ressource (etwa ein Datei-Handle oder eine Datenbankverbindung) in Anspruch

Weitere Kostenlose Bücher