Скорее всего, вы можете получить доступ к локальным переменным, определенным в begin
, в соответствующем блоке rescue
(если, конечно, исключение было вызвано после того, как переменная была установлена).
Что выне может получить доступ к локальным переменным, которые определены внутри блока, вне блока.Это не имеет ничего общего с исключениями.Посмотрите на этот простой пример:
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