Спасая и ловя одновременно
Если бы я хотел и спасти потенциальную ошибку, и поймать потенциальный бросок, как мне их вложить? Являются ли эти два ниже эквивалентными, и это просто вопрос предпочтений?
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
статьи.
Лично мне больше нравится первый.