Курс по Raku / Обекти, вход-изход и изключения / Изключения / Собствени изключения / Exercises / Грешка при отрицателно число

Решение: Грешка при отрицателно число

Ето едно възможно решение на задачата.

Код

class Negative is Exception {
    has $.n;

    method message {
        "$.n is negative";
    }
}

sub check($n) {
    Negative.new(n => $n).throw if $n < 0;
    return $n;
}

{
    say check(-5);

    CATCH {
        when Negative {
            say .message;
        }
    }
}

Negative.new(n => -10).throw;

🦋 Намерете програмата във файла negative-error.raku.

Изход

-5 is negative
-10 is negative
  in block <unit> at negative-error.raku line 24

Коментари

  1. Negative is Exception прави класа хвърляем, а методът му message използва атрибута n, за да изгради текста.

  2. check проверява входа си и хвърля собственото изключение за отрицателно число. Изключението излиза от check до CATCH в извикващия блок, където when Negative го съпоставя по тип и отпечатва съобщението. Проверката на входа и сигнализирането за лоши стойности с типизирано изключение е много честа, реална употреба на собствените изключения.

  3. Скобите { … } около извикването са там, защото фазерът CATCH обработва изключенията, хвърлени в собствения му обхващащ блок. Блокът групира рискованото check(-5) заедно с CATCH, който го пази, така че хвърленото изключение се прихваща точно тук, а изпълнението продължава веднага след блока. Без да ги обвием в блок, CATCH би пазил цялата програма — и щом прихване изключението, програмата просто би приключила, без естествено място, откъдето да продължи.

  4. Последното Negative.new(n => -10).throw показва другата страна на това. То стои извън блока, така че нищо не го прихваща: изключението се разпространява чак до върха и програмата умира, отпечатвайки съобщението и обратната следа в стандартната грешка и излизайки с ненулев статус. Това е съдбата по подразбиране на всяко изключение, което не прихванете — и точно затова първото хвърляне се нуждаеше от CATCH, за да оцелее.

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

Грешка при отрицателно число   |   Два типа изключения