Die Programmiersprache Ruby (German Edition)
wurden:
STDERR.puts "#{__FILE__}:#{__LINE__): Ungültige Daten"
Beachten Sie daneben, dass die Methoden
Kernel.eval
,
Object.instance_eval
und
Module.class_eval
alle einen Dateinamen (oder einen anderen String) sowie eine Zeilennummer als ihre beiden letzten Argumente akzeptieren. Wenn Sie Code auswerten, den Sie aus irgendeiner Art von Datei extrahiert haben, dann können Sie diese Argumente verwenden, um die Werte von
__FILE__
und
__LINE__
für die Auswertung festzulegen.
Sie haben sicherlich schon einmal bemerkt, dass, wenn eine Ausnahme ausgelöst und nicht behandelt wird, die auf der Konsole ausgegebene Fehlermeldung Dateinamen- und Zeilennummerninformationen enthält. Diese Informationen basieren natürlich auf
__FILE__
und
__LINE__
. Mit jedem
Exception
-Objekt ist ein Backtrace verknüpft, der genau zeigt, wo die Ausnahme ausgelöst wurde, wo die Methode aufgerufen wurde, die die Ausnahme ausgelöst hat, wo diese Methode aufgerufen wurde und so weiter. Die Methode
Exception.backtrace
gibt ein Array von Strings zurück, das diese Informationen enthält. Das erste Element dieses Array ist die Stelle, wo die Ausnahme aufgetreten ist, und jedes nachfolgende Element ist das nächsthöhere Stack-Frame.
Sie brauchen jedoch keine Ausnahme auszulösen, um einen aktuellen Stack-Trace zu erhalten. Die Methode
Kernel.caller
gibt den aktuellen Zustand des Call-Stacks in derselben Form zurück wie
Exception.backtrace
. Ohne Argumente liefert
caller
einen Stack-Trace zurück, dessen erstes Element die Methode ist, die wiederum die Methode aufgerufen hat, die
caller
ausführt. Das heißt,
caller[0]
gibt die Stelle an, von der die aktuelle Methode aufgerufen wurde. Sie können
caller
auch mit einem Argument aufrufen, das angibt, wie viele Stack-Frames vom Start des Backtrace aus weggelassen werden sollen. Der Standardwert ist 1, und
caller(0)[0]
gibt die Stelle an, an der die Methode
caller
aufgerufen wird. Das heißt zum Beispiel, dass
caller[0]
dasselbe ist wie
caller(0)[1]
und dass
caller(2)
dasselbe ist wie
caller[1..-1]
.
Die von
Exception.backtrace
und
Kernel.caller
zurückgegebenen Stack-Traces enthalten auch Methodennamen. Vor Ruby 1.9 mussten Sie die Stack-Trace-Strings parsen, um Methodennamen zu extrahieren. In Ruby 1.9 können Sie dagegen den Namen der aktuell ausgeführten Methode (als Symbol) mit
Kernel.__method__
oder ihrem Synonym
Kernel.__callee__
erhalten.
__method__
ist nützlich in Zusammenarbeit mit
__FILE__
und
__LINE__
:
raise "Annahme falsch in #{__method__} at #{__FILE__}:#{__LINE__}"
Beachten Sie, dass
__method__
den Namen zurückgibt, durch den eine Methode ursprünglich definiert wurde, selbst wenn die Methode durch einen Alias aufgerufen wurde.
Anstatt einfach den Dateinamen und die Zeilennummer auszugeben, wo ein Fehler auftritt, können Sie einen Schritt weiter gehen und die eigentliche Codezeile ausgeben. Wenn Ihr Programm eine globale Konstante namens
SCRIPT_LINES__
definiert und ihr einen Hash zuweist, dann fügen die Methoden
require
und
load
für jede Datei, die sie laden, einen Eintrag zu dieser Datei hinzu. Die Hash-Schlüssel sind Dateinamen, und die mit diesen Schlüsseln verknüpften Werte sind Arrays, die die Zeilen dieser Dateien enthalten. Wenn Sie die Hauptdatei (und nicht nur die mit
require
geladenen Dateien) in den Hash einfügen möchten, initialisieren Sie ihn wie folgt:
SCRIPT_LINES__ = {__FILE__ => File.readlines(__FILE__)}
Wenn Sie das tun, können Sie die aktuelle Quellcodezeile überall in Ihrem Programm mithilfe des folgenden Ausdrucks erhalten:
SCRIPT_LINES__[__FILE__][__LINE__-1]
Ruby ermöglicht Ihnen, Wertzuweisungen an globale Variablen mit
Kernel.trace_var
zu überwachen. Übergeben Sie dieser Methode ein Symbol, das eine globale Variable benennt, und einen String oder Codeblock. Wenn sich der Wert der angegebenen Variablen ändert, dann wird der String ausgewertet, oder der Block wird aufgerufen. Wenn ein Block angegeben wird, wird der neue Wert der Variablen als Argument übergeben. Rufen Sie
Kernel.untrace_var
auf, um das Tracing der Variablen zu beenden. Beachten Sie im folgenden Beispiel den Einsatz von
caller[1]
, um die Programmstelle zu bestimmen, an der der Variablen-Tracing-Block aufgerufen wurde:
# Bei jeder Änderung von $SAFE eine Meldung ausgeben
trace_var(:$SAFE) {|v|
puts "$SAFE gesetzt auf #{v} in #{caller[1]}"
}
Die letzte Tracing-Methode ist
Kernel.set_trace_func
; sie registriert eine
Proc
, die nach jeder Zeile eines Ruby-Programms
Weitere Kostenlose Bücher