2010-10-29 12 views
8

Yerel DeğişkenNeden kurtarma içinde yerel değişkene erişemiyoruz?

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 

Örnek Değişken

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

birincisi içinde veya 'başlamak ... rescue' dışında değişkene ben atamak olsun, benim için çalışıyor blok. –

+0

@Antal Başlama bloğu içinde işlem kullanıyorum ve içteki işlemi tanımladım. Sorun neden olabilir mi? Sorumu güncelledim. –

+0

Nasıl yerel derken? – xtofl

cevap

27
Sen kesinlikle tabii varsayarak tekabül rescue blokta (bir begin tanımlanan yerel değişkenler, erişebilir, istisna yükseltilmiştir

, sonra değişken ayarlandı).

Yapamadığınız şey, bir bloğun içinde, bloğun dışında tanımlanan yerel değişkenlere erişmek. Bunun istisnalarla ilgisi yok. Bunu düzeltmek için ne yapabilirsiniz

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

, (sadece nil olarak ayarlayabilirsiniz) bloktan önce değişken tanımlamak ve sonra bloğun içine ayarlamaktır: bu basit örneğe bakın. Böyle kodunuzu değiştirirseniz

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

Yani, işe yarayacak:

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

Sorumu güncelledim. Lütfen yardım edebilir misiniz? –

+0

@krunal: Cevabımı güncelledim. – sepp2k

İlgili konular