Люди делают комментарии вроде:
Это throw :async
действительно пугает меня
, потому что использование throw
сродни написанию GOTO.
![XKCD GOTO](https://i.stack.imgur.com/kuZZs.png)
Это big topic для обсуждения/дискуссии, но короткий ответ, что GOTO
s, как правило, с неодобрением, как «плохо структурированный» код.
Всегда можно решить проблему программирования без GOTO
s, и, видя их в коде , обычно указывает на хак, который вызовет проблемы по линии.
Вот пример throw
используется в коде Ruby:
def my_method
catch(:escape) do
outer_list.each do |item1|
inner_list.each do |item2|
throw :escape if item2 == "something"
end
end
puts "something was not found"
return
end
puts "something was found!"
end
выше throw
необходимо разорвать с вложенной петли ... Но, как вы можете видеть, надеюсь, есть много более простой/чистый способ написания вышеуказанного кода.
GOTO - слабый выход, когда у вас слабый дизайн.
Возможно два наиболее часто используемые аргументы против GOTO
с том, что код более трудно понять, и что существуют и другие способы, чтобы прибыть в определенный момент в коде.
Это не означает, что вы должны никогда использовать throw
заявления - а просто, что они, как правило, не рекомендуется, и вы должны тщательно продумать ваш дизайн, если вы обнаружили, нуждающихся в них.
'throw' (наряду с его сопровождающим' catch') просто выдает исключение, позволяющее избежать нескольких уровней без разрешения 'rescue'. Каждый раз, когда вы используете 'throw' в качестве механизма управления потоком, это красный флаг, что-то может быть неправильным, но есть времена, когда это лучший способ сделать это. –
'Ядро # throw' бросает объекты, а не исключения. Конечно, вы можете исключать исключения, поскольку они также являются объектами, но бросок является более общим, чем это. –