Курс Raku / Об’єкти, введення-виведення та винятки / Винятки
М’які збої
Кидання винятку через die спиняє все негайно. Іноді це
надто різко: ви хочете, щоб підпрограма повідомила, що не змогла дати
результат, але дозволила викликачеві вирішити, чи це фатально. Для цього
в Raku є м’які збої, які створюють через fail.
Коли підпрограма викликає fail, вона не кидає виняток
одразу. Натомість вона повертає викликачеві особливий об’єкт
Failure. Failure є невизначеним, тож викликач
може тихо його перевірити:
sub divide($a, $b) {
fail 'cannot divide by zero' if $b == 0;
return $a / $b;
}
say divide(10, 2); # 5
say divide(10, 0).defined; # FalseУспішний виклик повертає 5. Невдалий виклик повертає
Failure, який для defined повідомляє
False, тож викликач може перевірити результат, перш ніж ним
скористатися.
Failure називають м’яким, бо він перетворюється
на справжній кинутий виняток лише тоді, коли ви намагаєтеся скористатися
ним як значенням, спершу не перевіривши. Доки ви його обробляєте —
наприклад, перевіряючи defined, — він лишається тихим. Це
дозволяє підпрограмі сигналізувати про негаразд, не змушуючи спинятися
всю програму.
Ви це вже бачили
Такий відкладений стиль збою не є винятковою властивістю
fail. Раніше в цій частині ви двічі стикалися з тією самою
ідеєю.
Ділення на нуль тихо створює значення й кидає виняток лише тоді, коли ви ним справді користуєтеся:
my $x = 1 / 0; # помилки ще немає
say $x; # кидає лише тут, коли значення використаноЗовнішня програма, що зазнала невдачі, повертає
Proc, який кидає виняток, лише якщо ви відкидаєте його
необробленим; збережіть його й дослідіть — і він лишиться тихим
значенням:
run 'sh', '-c', 'exit 1'; # невдалий Proc відкинуто, тож це кидає винятокУ кожному з випадків негаразд не спиняє програму тієї миті, коли стається: він стає значенням, яке можна перевірити, і переростає в кинутий виняток, лише коли ви користуєтеся ним без перевірки або ігноруєте його. Тема Не кожна помилка негайна показує ці два випадки поруч.
Практика
Виконайте 1 тест за змістом цієї теми.
Вправи
У цьому розділі 3 вправи. Перш ніж братися до практики, вивчіть усі теми розділу.