2010-10-29 80 views
8

局部變量爲什麼我們不能在救援中訪問局部變量?

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 

實例變量

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

第一個爲我工作,我是否賦給變量內部或'開始... rescue'外塊。 – 2010-10-29 18:11:44

+0

@Antal我在開始塊內使用事務,並且我已經在事務內定義了對象。它會導致問題嗎?我更新了我的問題。 – 2010-10-29 18:16:21

+0

你是指本地人嗎? – xtofl 2010-10-29 18:16:53

回答

27

你肯定可以訪問相應的rescue塊(假設當然在begin定義的局部變量,異常已經提高,後變量被設置)。

你不能做的是訪問塊內定義的塊外部的局部變量。這與例外無關。看到這個簡單的例子:

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

,你能做些什麼來解決這個問題,是塊之前定義的變量(你可以將其設置爲無),然後將其設置塊內。

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

所以,如果你改變你這樣的代碼,它會工作:

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

我有更新我的問題。你能幫忙嗎? – 2010-10-29 18:26:03

+0

@krunal:我更新了我的答案。 – sepp2k 2010-10-29 18:32:53

相關問題