Спасая и ловя одновременно

Если бы я хотел и спасти потенциальную ошибку, и поймать потенциальный бросок, как мне их вложить? Являются ли эти два ниже эквивалентными, и это просто вопрос предпочтений?

begin
  catch(:some_throw) do
    ...
  end
rescue SomeError
  ...
end


catch(:some_throw) do
  begin
    ...
  rescue SomeError
    ...
  end
end

2 ответа

Решение

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

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

Даже если вы использовали throw а также catch просто для того, чтобы управлять итерациями цикла и выходить из него при определенных условиях, второй вариант все еще кажется более читабельным и инкапсулирует всю логику внутри catch блок.

Они не полностью эквивалентны. С первой альтернативой catch будет только перехватывать значения, брошенные в begin пункт, в то время как второй включает в себя те из rescue тоже.


Это, как говорится, если вы в случае, когда два эквивалентны (иначе вы не бросаете :some_throw в rescue пункт):

  • Аргумент в пользу первой альтернативы заключается в том, что мы склонны считать, что begin - rescue блоки заключают в себе "обычные" операторы. throw - catch будучи редко используемым и имеющим семантику без ошибок, более "регулярны"-y.

  • Аргументом для второй альтернативы было бы то, что нужно стремиться заключить наименьшее количество (только, возможно, ошибочный) кода в begin - rescue статьи.

Лично мне больше нравится первый.

Другие вопросы по тегам