Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni

🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

03.05.2024

Винятки в мовах програмування

У всіх великих сучасних мовах програмування є винятки (тобто exception). Проте на відміну від функцій або змінних, сенс та використання винятків різняться настільки, що не можна просто прийти з власним знанням в іншу мову та робити там все за звичкою.

В Ruby винятки — це механізм обробки помилок будь-якого рівня — від SyntaxError до специфічної помилки бізнес-логіки. Ну, тобто, за домовленістю на “однозначні” помилки можна просто повернути nil, а все, що не вкладається в nil, утворює виняток. Та, в Ruby дійсно можна спіймати навіть помилку синтаксису або вихід з програми. Зазвичай так роблять не навмисно, а тому, що ловлять пращур всіх помилок: Exception - про це в мене є дуже стара стаття.

В JavaScript якийсь час механізм винятків якось ігнорувався, тобто їх обробку рідко можна було побачити. Не в останню чергу тому, що вони не були сумісними з Promise та рівночасним кодом. Втім, з впровадженням синтаксису async/await блоком обробки винятку try ... catch можна охопити скільки завгодно асинхронної логіки, тому винятки знову повертаються в моду. Втім, в JavaScript немає чітко визначеної класифікації винятків. Навіть в TypeScript неможливо зазначити, якого типу ти очікуєш помилку.

В Go виняток, тобто паніка — це, за посібником, реакція на помилку розробника. Тобто таку, яку виправити може тільки зміна в програмі, а не в даних чи обставинах. Решта помилок повертається з функцій напряму. Фактично в більшості випадків ми просто емулюємо механізм винятків вручну та передаємо помилку назовні.

У Swift функція мусить явно оголосити, що вона створює винятки, модифікатором throws. Відповідно, функції, що її викликають, або обробляють винятки, або успадковують модифікатор. З типом Optional на винятки залишається не так багато потреб — зазвичай це помилки вводу/виводу. Але деякі помилки на кшталт “індекс за межами масиву” вважаються “помилками розробника” та їх спіймати взагалі неможливо - “сам винний!”. Тож паніки в Go це ще дружня поведінка!