Мова програмування Rust принципово відмовляється від класичної моделі винятків, знайомої розробникам Java, C++ чи Python. Натомість вона змушує працювати з помилками явно — через значення, типи та перевірки на етапі компіляції. Про цей підхід розповіла інженерка з команди Rust for Android у Google та радниця Rust language team в інтерв’ю на каналі The Pragmatic Engineer.

Ніяких throw: помилка як значення
У Rust помилки повертаються не через throw, а як звичайні значення:
- замість винятку функція повертає тип-енум, наприклад
Result - цей тип кодує два варіанти: успішний результат або помилку
Тобто виклик функції, яка може завершитися збоєм, завжди повертає щось на кшталт:
- «успіх із даними» або
- «помилка з описом проблеми»
Це змушує розробника явно враховувати обидва сценарії, а не покладатися на приховані винятки, які можуть «вистрілити» будь-де в глибині стеку викликів.
Оператор ?: короткий синтаксис без магії
Щоб робота з такими результатами не перетворювалася на нескінченні if, у Rust є спеціальний оператор ?. Його ставлять після виклику функції:
let data = read_file(path)?;
Семантика проста:
- якщо виклик успішний — з
Resultдістається значення, і виконання триває; - якщо сталася помилка — вона автоматично повертається з поточної функції.
Таким чином:
- обробка помилок стає короткою, але
- залишається явною — це не «нуль символів», як у випадку з винятками, де можна взагалі нічого не писати й отримати приховану точку відмови.
Компілятор змушує не ігнорувати помилки
Ключова відмінність від багатьох мов із винятками — Rust не дозволяє «забути» про можливу помилку. Якщо функція повертає Result, а розробник:
- не використав оператор
?, і - не обробив результат вручну,
компілятор видасть помилку. Код просто не збереться.
Це створює важливу гарантію:
- немає «тихих» проігнорованих помилок;
- немає прихованих умов, про які «не подумали», але які в продакшені можуть покласти сервер.
За потреби розробник може:
- обробити помилку вручну (логування, перетворення в інший тип помилки, повторна спроба тощо);
- або явно «пробросити» її далі через
?.
У будь-якому разі рішення має бути записане в коді.
Менше неочікуваних збоїв у продакшені
Така модель спрямована на усунення класу проблем, коли:
- в коді є неявна умова помилки;
- її ніхто не врахував;
- у результаті в продакшені «падає» цілий сервіс.
Rust намагається перенести ці помилки з рантайму в час компіляції. Замість того, щоб дізнатися про проблему під навантаженням, розробник отримує жорстке попередження ще до запуску програми.
Це робить обробку помилок:
- прозорою — усі потенційні збої видно в сигнатурах функцій;
- примусовою — компілятор не дасть проігнорувати результат;
- керованою — кожен шлях обробки помилки явно описаний у коді.


