LINUX.ORG.RU

[ruby] Объясните поведение

 


0

1

добрый день.

есть приблизительно такой код

module A
  def module_method
    begin
      instance_method
    rescue => exception
      p exception
    end
  end
end

class B
  include A

  def instance_method
    begin
      #... 
    rescue ArgumentError
      puts 'rescued!'
    end
  end
end

B.new.module_method

так вот, по какой-то причине, мне не понятно, код внутри метода B#instance_method не отлавливал ArgumentError, его ловил уже метод module_method. т.е. 'rescued!' не выводилось на экран, а выводилось уже сразу тип exception.

Может ли кто-то подсказать, в чём, возможно, была проблема? спасибо

★★
Ответ на: комментарий от xetf

дык у меня такой код тоже нормально работает. если добавить после rescue ArgumentError такое

rescue StandardError => e
p e.class
то оно будет писать, собственно, ArgumentError

do0dlez ★★
() автор топика
Ответ на: комментарий от do0dlez

Так?

module A
  def module_method
    instance_method
  rescue => exception
    p exception
  end
end

class B
  include A

  def instance_method
    fail ArgumentError
  rescue ArgumentError
    puts 'rescued!'
  rescue StandardError => e
    p e.class
  end
end

B.new.module_method

Пишет 'rescued!'.

xetf ★★
()
Ответ на: комментарий от do0dlez

и да, такие урезанные примеры у меня тоже нормально работают, но код, который сводится к этим примерам не работает. Я пытаюсь просто понять из-за чего это может быть

do0dlez ★★
() автор топика
Ответ на: комментарий от do0dlez

Никак не могу воспроизвести. Что у вас там на месте '#...'?

xetf ★★
()
Ответ на: комментарий от do0dlez

Значит как-то не так сводите. Возможно исключение обрабатывается, но во время этой обработки опять вбрасывается ArgumentError.

xetf ★★
()
Ответ на: комментарий от xetf

Вот так, например:

module A
  def module_method
    instance_method
  rescue => exception
    p exception
  end
end

class B
  include A

  def instance_method
    fail ArgumentError
  rescue ArgumentError
    fail
    puts 'rescued!'
  end
end

B.new.module_method

xetf ★★
()
Ответ на: комментарий от xetf

вот кусок трейсбэка, откуда ошибка выплывает

/usr/lib/ruby/1.8/date.rb:1522:in `civil'
/usr/lib/ruby/gems/1.8/gems/activesupport-3.0.9/lib/active_support/core_ext/date_time/conversions.rb:79:in `civil_from_format'
/usr/lib/ruby/gems/1.8/gems/activesupport-3.0.9/lib/active_support/core_ext/time/calculations.rb:31:in `time_with_datetime_fallback'
/usr/lib/ruby/gems/1.8/gems/activesupport-3.0.9/lib/active_support/core_ext/time/calculations.rb:36:in `utc_time'
/usr/lib/ruby/gems/1.8/gems/activesupport-3.0.9/lib/active_support/core_ext/time/calculations.rb:74:in `send'
/usr/lib/ruby/gems/1.8/gems/activesupport-3.0.9/lib/active_support/core_ext/time/calculations.rb:74:in `change'

Даже если в rescue StandardError =>e написать так:

p e.class
p e.class == ArgumentError
выдаёт
ArgumentError
false

do0dlez ★★
() автор топика
Ответ на: комментарий от xetf

я в тот rescue помещал просто тесты. не отрабатываются они, и я не пойму, в чём дело

do0dlez ★★
() автор топика
Ответ на: комментарий от do0dlez
p e.class
p e.class == ArgumentError

выдаёт

ArgumentError
false

Хм, странно. Может там свой собственный ArgumentError. Попробуйте в rescue StandardError => e написать так::

p e.class.object_id
p ArgumentError.object_id

xetf ★★
()
Ответ на: комментарий от xetf

да, вот в чём было проблема, спасибо

do0dlez ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.