Typed throws: конкретный тип ошибки в сигнатуре ☘️
🧵 throws(NetError) выносит точный тип ошибки в контракт функции. Появилось в Swift 6.0 (SE-0413).
Что это реально даёт: в catch ошибка уже типизирована — писать catch let e as NetError не нужно, можно сразу switch по кейсам или catch .badURL.
⚠️ Но вот чего почти никто не пишет: типизированный паттерн сам по себе do/catch исчерпывающим не делает. В пропозале прямым текстом: «единственный способ написать исчерпывающий do...catch — безусловный catch-блок. Динамическая проверка через is или as не может сделать catch исчерпывающим, даже если тип совпадает». Так что безусловный catch всё равно нужен. И ещё одна ловушка: один обычный throw внутри тела do роняет вывод типа обратно к any Error — throw всегда бросает значение типа any Error. Чтобы catch остался типизированным, все пути должны идти через typed-throwing вызовы. rethrows при этом не изменился и остался нетипизированным. Его заменяет дженерик throws(E), где E выводится в Never для небросающих замыканий.