Курс Raku / Об’єкти, введення-виведення та винятки / Винятки / Перехоплення винятків за допомогою try

Не кожна помилка виникає одразу

За замовчуванням кинутий виняток одразу зупиняє програму, а try — це спосіб його перехопити. Але не все, що виглядає як фатальна помилка, справді спиняє вашу програму тієї ж миті, коли стається. У Raku є збої, які поводяться тихо, відкладаючи свою реакцію до моменту, коли ви скористаєтеся результатом, або дозволяючи вам дослідити їх і рушити далі. Кілька з них уже траплялися в цій частині, і варто зібрати їх в одному місці.

Ділення на нуль. Ділення на нуль не вибухає там, де його записано. Погане значення створюється й тихо тримається; воно кидає виняток лише тоді, коли ви його використовуєте — наприклад, виводите чи зводите до іншого типу:

my $x = 1 / 0;    # тут помилки немає
say 'still running';
say $x;           # ось тепер вона кидається

Ця відкладена поведінка та об’єкти Failure, що за нею стоять, є темою розділу М’які збої.

Зовнішня програма, що зазнала невдачі. Об’єкт Proc, який повертають run чи shell і який завершився невдало, не кидає винятку в мить свого створення. Він кидає його лише тоді, коли ви відкидаєте його необробленим; збережіть його й прочитайте .exitcode (або перевірте як булеве значення) — і збій лишиться звичайним значенням, на яке можна відреагувати. Ви бачили це в темі Об’єкт Proc.

Спільна нитка тут така: збій можна відкласти — перетворити на значення, яке ви дослідите, коли будете готові, замість негайного падіння. try та фазер CATCH мають справу з помилками, які кидаються одразу; ці механізми — з тими, що ні.

Навігація курсом

Перехоплення винятків за допомогою try   |   Перехопіть помилку


💪 Або перейдіть одразу до вправ цього розділу.