Курс по 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Коментари
Negative is Exceptionправи класа хвърляем, а методът муmessageизползва атрибутаn, за да изгради текста.checkпроверява входа си и хвърля собственото изключение за отрицателно число. Изключението излиза отcheckдоCATCHв извикващия блок, къдетоwhen Negativeго съпоставя по тип и отпечатва съобщението. Проверката на входа и сигнализирането за лоши стойности с типизирано изключение е много честа, реална употреба на собствените изключения.Скобите
{ … }около извикването са там, защото фазерътCATCHобработва изключенията, хвърлени в собствения му обхващащ блок. Блокът групира рискованотоcheck(-5)заедно сCATCH, който го пази, така че хвърленото изключение се прихваща точно тук, а изпълнението продължава веднага след блока. Без да ги обвием в блок,CATCHби пазил цялата програма — и щом прихване изключението, програмата просто би приключила, без естествено място, откъдето да продължи.Последното
Negative.new(n => -10).throwпоказва другата страна на това. То стои извън блока, така че нищо не го прихваща: изключението се разпространява чак до върха и програмата умира, отпечатвайки съобщението и обратната следа в стандартната грешка и излизайки с ненулев статус. Това е съдбата по подразбиране на всяко изключение, което не прихванете — и точно затова първото хвърляне се нуждаеше отCATCH, за да оцелее.