mavka-ukr / mavka

Сучасна українська мова програмування
https://мавка.укр
Other
54 stars 4 forks source link

Помилка як значення #40

Open DanikVitek opened 1 year ago

DanikVitek commented 1 year ago

Пропозиція

Для обробки помилок використовувати, в основному, значення замість кидання винятків. Кидання винятків не прибирати, бо для швидкого написання коду, або для ситуацій, з яких не відновитися, вони корисні.

Мотивація

Класичне кидання помилок не є надійним, оскільки це є вириванням з потоку керування. Не відомо коли, хто, і чи взагалі відреазує на виняток. Ловити винятки синтаксично не обов'язково, а якби було обов'язково, то код би або виглядав загромаджено і гірше читався, або була би одна точка реагування на помилки, з якої не зрозуміло, без заглиблення у код, джерело самої помилки.

Можливий вигляд реалізації

Наразі, обговорений у телеграм чаті варіант виглядає наступним чином:

дія додати_з_умовою(а, б)
  якщо а більше 999
    вернути Помилка("а має бути не більше 999")
  кінець

  Ок([а + б, а + а, б + б])
кінець

[аб, аа, бб] = додати_з_умовою(1000, 2) ;; кидає помилку
[аб, аа, бб], помилка = додати_з_умовою(1000, 2) ;; не кидає помилку

Тобто тут суть, що з дії може вернутись Ок, або Помилка (як всюди). Коли дія викликається, то з неї вертається або Ок, або Помилка. За замовчуванням вертається розгорнутий Ок, але є можливість обробити помилку записавши її в змінну через другий арумент оператора присвоєння.

ок, помилка = додати_з_умовою(...)
;; якщо вернулось Ок, то в "ок" буде результат обчислення
;; якщо вернулось Помилка, то в "ок" буде пусто, а в "помилка" буде Помилка

ок = додати_з_умовою(...)
;; тут те саме, тільки якщо вернулось Помилка, то ця помилка буде викинута через "впасти", так як користувач ніяк не обробив
DanikVitek commented 1 year ago

Ще варіант: додати оператор, на кшталт ?, що автоматично перевіряє результат, і, у разі помилки рано виходить з функції, а оператором виду ! розпаковувати результат для швидкого отримання значення:

дія додати_з_умовою(а, б)
  якщо а більше 999
    Помилка("а має бути не більше 999")
  кінець

  Ок(а + б)
кінець

результат = додати_з_умовою(1000, 2)! ;; кидає помилку

дія суму_до_квадрату(а, б)
  сума = додати_з_умовою(а, б)? ;; у разі помилки поверне її одразу з функції на цьому рядку
  Ок(сума * сума)
кінець