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:
die behandelte Ausnahme erneut ausgelöst.
Wenn
raise
mit einem einzelnen
Exception
-Objekt als Argument aufgerufen wird, wird diese Ausnahme ausgelöst. Trotz der Einfachheit ist das eigentlich keine gängige Art,
raise
einzusetzen.
Wenn
raise
mit einem einzelnen String-Argument aufgerufen wird, wird ein neues
RuntimeError
-Ausnahmeobjekt mit dem angegebenen String als Meldung erzeugt, und diese Ausnahme wird ausgelöst. Das ist eine gängige Art und Weise,
raise
zu verwenden.
Wenn das erste Argument von
raise
ein Objekt ist, das eine
exception
-Methode hat, dann ruft
raise
diese Methode auf und löst die von ihr zurückgegebene Ausnahme aus. Die Klasse
Exception
definiert eine
exception
-Methode, so dass Sie das Klassenobjekt für jede Art von Ausnahme als erstes Argument von raise angeben können.
raise
akzeptiert einen String als optionales zweites Argument. Wenn ein String angegeben wird, dann wird er an die
exception
-Methode des ersten Arguments übergeben. Der String ist für den Einsatz als Ausnahmemeldung gedacht.
raise
akzeptiert auch ein optionales drittes Argument. Hier kann ein Array von Strings angegeben werden, das als Backtrace für das Ausnahmeobjekt verwendet wird. Wenn dieses dritte Argument nicht angegeben wird, setzt
raise
den Backtrace der Ausnahme selbst (mithilfe der Kernel-Methode
caller
).
    Der folgende Code definiert eine einfache Methode, die eine Ausnahme auslöst, wenn sie mit einem Paremeter aufgerufen wird, dessen Wert ungültig ist:
def factorial(n) # factorial-Methode mit Argument n definieren
raise "Falsches Argument" if n < 1 # Ausnahme für ungültiges n auslösen
return 1 if n == 1 # factorial(1) ist 1
n * factorial(n-1) # Andere Fakultäten rekursiv berechnen
end
    Diese Methode ruft
raise
mit einem einzelnen String als Argument auf. Es gibt einige äquivalente Arten, dieselbe Ausnahme auszulösen:
raise RuntimeError, "Falsches Argument" if n < 1
raise RuntimeError.new("Falsches Argument") if n < 1
raise RuntimeError.exception("Falsches Argument") if n < 1
    In diesem Beispiel ist eine Ausnahme der Klasse
ArgumentError
wahrscheinlich geeigneter als
RuntimeError
:
raise ArgumentError if n < 1
    Und eine detailliertere Fehlermeldung wäre hilfreich:
raise ArgumentError, "Argument >= 1 erwartet. #{n} erhalten" if n < 1
    Die Aufgabe der Ausnahme, die wir hier auslösen, besteht darin, auf ein Problem mit dem Aufruf der Methode
factorial
hinzuweisen und nicht auf ein Problem mit dem Code innerhalb der Methode. Die hier von dem Code ausgelöste Ausnahme wird ein Backtrace enthalten, dessen erstes Element anzeigt, wo
raise
aufgerufen wurde. Das zweite Element des Array wird den eigentlichen Code anzeigen, der
factorial
mit dem falschen Argument aufgerufen hat. Wenn wir direkt auf den problematischen Code verweisen möchten, können wir mit der Kernel-Methode
caller
einen eigenen Stack-Trace als drittes Argument von
raise
angeben:
if n < 1
raise ArgumentError, "Arg. >= 1 erwartet. #{n} erhalten", caller
end
    Beachten Sie, dass die Methode
factorial
überprüft, ob ihr Argument im korrekten Bereich liegt, aber nicht, ob es vom richtigen Typ ist. Wir könnten eine vorsichtigere Fehlerüberprüfung hinzufügen, indem wie die folgende Zeile als erste in der Methode einfügen:
raise TypeError, "Integer-Argument erwartet" if not n.is_a? Integer
    Betrachten Sie andererseits, was passiert, wenn wir der Methode
factorial
, wie Sie oben gezeigt wurde, ein String-Argument übergeben. Ruby vergleicht das Argument mithilfe des Operators
<
mit dem Integer
1
. Wenn das Argument ein String ist, ergibt der Vergleich keinen Sinn und scheitert, wobei er einen
TypeError
auslöst. Wenn das Argument eine Instanz irgendeiner Klasse ist, die keinen
<
-Operator definiert, erhalten wir stattdessen einen
NoMethodError
.
    Der Punkt ist hier, dass Ausnahmen selbst dann auftreten können, wenn wir in unserem eigenen Code nicht
raise
aufrufen. Es ist daher wichtig, zu wissen, wie man mit Ausnahmen umgeht, selbst wenn wir sie niemals selbst auslösen. Die Ausnahmebehandlung wird im nächsten Abschnitt behandelt.
    5.6.3 Ausnahmebehandlung mit rescue
    raise
ist eine Kernel-Methode. Eine
rescue
-Klausel ist im Gegensatz dazu ein Grundbestandteil der Programmiersprache Ruby.
rescue
ist keine Anweisung für sich allein, sondern vielmehr eine Klausel, die mit anderen Ruby-Anweisungen verknüpft werden kann. Am häufigsten wird eine
rescue
-Klausel mit einer
begin
-Anweisung verknüpft. Die Anweisung
begin
existiert

Weitere Kostenlose Bücher