Курс по 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, който съобщава False за defined, така че извикващият може да провери резултата, преди да го използва.

Failure се нарича мек, защото се превръща в истинско, хвърлено изключение само ако се опитате да го използвате като стойност, без първо да сте го проверили. Докато го обработвате — например като проверите defined, — той си остава тих. Това позволява на подпрограмата да сигнализира за проблем, без да принуждава цялата програма да спре.

Виждали сте това и преди

Този отложен стил на провал не е присъщ само на fail. По-рано в тази част срещнахте същата идея два пъти.

Делението на нула произвежда стойност тихо и хвърля едва когато действително я използвате:

my $x = 1 / 0;   # още няма грешка
say $x;           # хвърля едва тук, когато стойността се използва

Провалила се външна програма връща Proc, който хвърля само ако го изхвърлите необработен; запазете го и го разгледайте — и той си остава тиха стойност:

run 'sh', '-c', 'exit 1';   # провалилият се Proc е изхвърлен, затова това хвърля

Във всеки от случаите проблемът не спира програмата в мига, в който се случва: той се превръща в стойност, която можете да проверите, и прераства в хвърлено изключение само когато я използвате непроверена или я пренебрегнете. Темата Не всяка грешка е незабавна показва тези два случая един до друг.

Практика

Направете 1 тест върху съдържанието на тази тема.

Упражнения

Този раздел съдържа 3 упражнения. Разгледайте всички теми в раздела, преди да се захванете с практиката.

  1. Меко обратно число
  2. Търсене или ненамерено
  3. Резервна стойност

Навигация в курса

Тест — Обекти на изключения   |   Меко обратно число