2010-10-29 5 views
8

Lokale VariableWarum können wir nicht auf lokale Variable innerhalb der Rettung zugreifen?

begin 
    transaction #Code inside transaction 
    object = Class.new attributes 
    raise unless object.save! 
    end 
rescue 
    puts object.error.full_messages # Why can't we use local varible inside rescue ? 
end 

Instanz Variable

begin 
    transaction #Code inside transaction 
    @object = Class.new attributes 
    raise unless @object.save! 
    end 
rescue 
    puts @object.error.full_messages # This is working fine. 
end 
+1

Die erste funktioniert für mich, ob ich auf die Variable innerhalb oder außerhalb des 'beginnen ... rescue' zuweisen Block. –

+0

@Antal Ich benutze Transaktion innerhalb beginnen Block und ich habe Objekt innerhalb der Transaktion definiert. Kann es das Problem verursachen? Ich habe meine Frage aktualisiert. –

+0

Wie lokal meinst du? – xtofl

Antwort

27

Sie sicherlich lokale Variablen in einem begin definiert zugreifen können, in dem entsprechenden rescue Block (vorausgesetzt natürlich hat die Ausnahme ausgelöst wurde, nachdem der Variable wurde eingestellt).

Sie können nicht auf lokale Variablen zugreifen, die innerhalb eines Blocks außerhalb des Blocks definiert sind. Das hat nichts mit Ausnahmen zu tun. Sehen Sie dieses einfache Beispiel:

define transaction() yield end 
transaction do 
    x = 42 
end 
puts x # This will cause an error because `x` is not defined here. 

Was Sie dieses Problem beheben kann tun, ist die Variable vor dem Block zu definieren (Sie können es einfach auf Null gesetzt) ​​und dann innerhalb des Blocks festgelegt.

x = nil 
transaction do 
    x = 42 
end 
puts x # Will print 42 

Also, wenn Sie Ihren Code wie folgt ändern, wird es funktionieren:

begin 
    object = nil 
    transaction do #Code inside transaction 
    object = Class.new attributes 
    raise unless object.save! 
    end 
rescue 
    puts object.error.full_messages # Why can't we use local varible inside rescue ? 
end 
+0

Ich habe meine Frage aktualisiert. Kannst du bitte dabei helfen? –

+0

@krunal: Ich habe meine Antwort aktualisiert. – sepp2k

Verwandte Themen