Die Programmiersprache Ruby (German Edition)
Ausnahmezustand signalisieren möchten, verwenden Sie
raise
statt
throw
.
Der folgende Code demonstriert, wie
throw
und
catch
verwendet werden können, um aus verschachtelten Schleifen »auszubrechen«:
for matrix in data do # Mehrfach verschachtelte Datenstruktur verarbeiten
catch :missing_data do # Label für Anweisung zum Ausbrechen
for row in matrix do
for value in row do
throw :missing_data unless value # Aus zwei Schleifen ausbrechen
# Hier andernfalls die eigentliche Verarbeitung durchführen
end
end
end
# Wir kommen schließlich hier an, nachdem die verschachtelte
# Schleife mit dem Verarbeiten jeder Matrix fertig ist.
# Wir gelangen auch hierhin, wenn :missing_data ausgelöst wird.
end
Beachten Sie, dass die Methode
catch
ein Symbolargument und einen Block entgegennimmt. Sie führt den Block aus und kehrt zurück, wenn der Block beendet wird oder wenn das angegebene Symbol ausgelöst wird.
throw
erwartet ebenfalls ein Symbol als Argument und sorgt dafür, dass der entsprechende
catch
-Aufruf zurückkehrt. Wenn kein
catch
-Aufruf dem Symbol entspricht, das an
catch
übergeben wurde, wird eine
NameError
-Ausnahme ausgelöst. Sowohl
catch
als auch
throw
können mit String-Argumenten statt mit Symbolen aufgerufen werden. Diese werden intern in Symbole konvertiert.
Eines der Features von
throw
und
catch
ist, dass sie sogar funktionieren, wenn
sie
sich in unterschiedlichen Methoden befinden. Wir könnten diesen Code so umschreiben, dass die innerste Schleife sich in einer separaten Methode befindet, und der Steuerungsablauf würde noch immer korrekt funktionieren.
Wenn
throw
niemals aufgerufen wird, gibt ein
catch
-Aufruf den Wert des letzten Ausdrucks in seinem Block zurück. Wenn
throw
aufgerufen wird, ist der Rückgabewert des entsprechenden
catch
standardmäßig
nil
. Sie können allerdings einen beliebigen Rückgabewert für
catch
festlegen, indem Sie
throw
ein zweites Argument übergeben. Der Rückgabewert von
catch
kann Ihnen helfen, den normalen Abschluss eines Blocks vom außergewöhnlichen Abschluss mit
throw
zu unterscheiden, und das erlaubt Ihnen das Schreiben von Code, der notwendige Sonderaufgaben erfüllt, um auf das
throw
zu reagieren.
throw
und
catch
werden in der Praxis nicht häufig eingesetzt. Wenn Sie bemerken, dass Sie
catch
und
throw
innerhalb derselben Methode verwenden, ziehen Sie in Erwägung, das
catch
in eine separate Methodendefinition umzuwandeln und das
throw
durch ein
return
zu ersetzen.
5.6 Ausnahmen und Ausnahmebehandlung
Eine Ausnahme (englisch exception ) ist ein Objekt, das eine Art Ausnahmezustand repräsentiert; sie zeigt an, dass etwas schiefgelaufen ist. Es könnte eine Programmierfehler sein – der Versuch, durch Null zu dividieren, der Versuch, eine Methode für ein Objekt aufzurufen, das diese Methode nicht definiert, oder die Übergabe eines ungültigen Arguments an eine Methode. Oder es könnte das Ergebnis irgendeiner Art von externer Bedingung sein – das Durchführen einer Netzwerkanfrage, wenn das Netzwerk nicht verfügbar ist, oder der Versuch, ein Objekt zu erzeugen, wenn dem System der Speicher ausgegangen ist.
Wenn einer dieser Fehler oder Zustände auftritt, wird eine Ausnahme ausgelöst (oder ausgeworfen , englisch raised bzw. thrown ). Standardmäßig werden Ruby-Programme beendet, wenn eine Ausnahme auftritt. Aber es ist möglich, Ausnahme-Handler zu deklarieren. Ein Ausnahme-Handler ist ein Codeblock, der ausgeführt wird, wenn während der Ausführung eines anderen Codeblocks eine Ausnahme auftritt. In diesem Sinne sind Ausnahmen eine Art von Steueranweisungen. Das Auslösen einer Ausnahme überträgt den Steuerungsablauf an den Ausnahmebehandlungscode. Das ähnelt der Verwendung der Anweisung
break
, um aus einer Schleife auszusteigen. Wie wir sehen werden, unterscheiden sich Ausnahmen jedoch bis zum einem gewissen Grad von der
break
-Anweisung; sie können die Kontrolle aus mehreren umschließenden Blöcken heraus und sogar den Call-Stack hinauf übertragen, um den Ausnahme-Handler zu erreichen.
Ruby verwendet die Kernel-Methode
raise
, um Ausnahmen auszulösen, und eine
rescue
-Klausel, um Ausnahmen zu behandeln. Ausnahmen, die durch
raise
ausgelöst werden, sind Instanzen der Klasse
Exception
oder einer ihrer zahlreichen Unterklassen. Die Methoden
throw
und
catch
, die weiter oben in diesem Kapitel beschrieben wurden, dienen nicht dem Signalisieren und Behandeln von Ausnahmen, aber ein Symbol, das durch
throw
ausgeworfen
Weitere Kostenlose Bücher