Они могут быть действительно полезны для упрощения DSL для конечных пользователей, передавая управление из DSL без необходимости сложных операторов case / if
У меня есть приложение на Ruby, которое позволяет пользователям расширять его через внутренний DSL. Некоторые функции в DSL должны вернуть управление определенным частям моего приложения. Давайте возьмем простой пример. Предположим, что пользователь разрабатывает простое расширение для дат
if today is a holiday then
do nothing
end
week_of_year = today.week.number
if week_of_year < 10 then
...
Бит do nothing
запускает бросок, который передает управление из оператора exec и обратно ко мне.
Вместо того, чтобы продолжать выполнять DSL, при некоторых условиях мы хотим, чтобы он завершил работу и передал управление обратно моему приложению. Теперь вы можете заставить пользователя использовать множество встроенных операторов if и, естественно, завершить DSL, но это просто затеняет то, что пытается сказать логика.
Бросок - это действительно goto, который считается «опасным», но, черт возьми, иногда они являются лучшим решением.