Джерело
BW Swift | Помічали, що всередині блоку Task throwing функції не потребують викон...
718 Охват/переглядів
2025-08-01 19:28
Повідомлення №1932
Помічали, що всередині блоку Task throwing функції не потребують виконання через do-catch? Якщо так, то можливо ви помічали, що навіть фейл у throwing операції НЕ призводить до крашу всередині Task? Ну, в деякому сенсі всеж таки призводить. Давайте розбиратися. Така поведінка може видаватися контрінтуітивною на перший погляд. В синхронном коді необроблена помилка з try зазвичай призводить до крешу. Ба більше: зазвичай такі операції ВИМАГАЮТЬ огортання в do-catch або опціональну огортку. Але всередині Swift Concurrency Task логіка відрізняється. Дехто в мережі вважає це помилкою розробників, недопрацьованим моментом. Але мені задум зрозумілий: ви все ще маєте змогу опрацювати помилку всередині Task через do-catch, але якщо ви цього не робите, Swift припускає, що ви навмисно закладаєте логіку відміни Task. Тобто, Task на моменті помилки необробленої try просто відміняється. Тихо, непомітно, без крашу, без логів. Ви все ще можете отримати краш, якщо явно викличете force-unwrap (try!), чи просто пропустити фейлову ділянку через опціонал (try?), або можете спіймати помилку через do-catch. Чому така поведінка можлива? Тут все просто: закенселити асинхронний блок коду - відносно очікуваний сценарій за замовчуванням, що потенційно є безпечною реакцією. ------------------------------Я часто пишу і писав різні здебільшого технічні цікавинки на моєму Linkedin. Можеш підписатися, якщо було цікаво =)