Typed throws: когда использовать
Вопрос
В Swift 6 появились typed throws. Будете ли вы переводить на них API своего модуля?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Синтаксис `throws(MyError)`, в catch конкретный тип без приведения
`throws` равно `throws(any Error)`, `throws(Never)` значит не бросает
Плюс: исчерпывающая обработка, нет упаковки в existential, полезно для встраиваемого кода
Минус: тип ошибки становится частью API, новые случаи ломают клиентов
Хорошо для внутренних модулей и обобщённого кода (`rethrows` через дженерик ошибки)
Что могут спросить следом
- Как typed throws помогает дженерикам вроде
map? - Что будет при вызове двух функций с разными типами ошибок в одном
do?
Разбор
Typed throws позволяют объявить throws(ParsingError), и тогда в catch переменная error уже нужного типа, без as?, а switch по ней можно сделать исчерпывающим. Обычный throws теперь формально throws(any Error), а throws(Never) это функция, которая не бросает. Ещё один плюс: нет упаковки ошибки в existential, это важно для встраиваемого и высоконагруженного кода. И дженерики выигрывают: функция может пробросить ровно тот тип ошибки, который бросает замыкание. Но тип ошибки становится частью контракта: добавил новый случай, сломал клиентов. Поэтому я бы использовал typed throws во внутренних модулях и в узких местах, где набор ошибок замкнут, а публичный API модуля оставил с обычным throws. Если в одном do смешаны разные типы ошибок, catch получит any Error.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.