Вы можете использовать оператор Perl eval
для перехвата исключений, в том числе от попыток вызова методов с неопределенным аргументом:
eval {
say $shop->ShopperDueDate->day_name();
};
Поскольку eval
возвращает последний оцененный оператор или undef
при ошибке, вы можете записать название дня в переменную следующим образом:
my $day_name = eval { $shop->ShopperDueDate->day_name(); };
Если вы действительно хотите проверить исключение, вы можете посмотреть в специальной переменной $@
. Обычно это будет простая строка для встроенных исключений Perl, но может быть полным объектом исключения, если исключение происходит из autodie или другого кода, который использует исключения объекта.
eval {
say $shop->ShopperDueDate->day_name();
};
if ($@) {
say "The error was: $@";
}
Также возможно связать воедино последовательность команд, используя блок eval
. Следующее будет только проверять, если это выходные, при условии, что у нас не было никаких исключений при поиске $day_name
.
eval {
my $day_name = $shop->ShopperDueDate->day_name();
if ($day_name ~~ [ 'Saturday', 'Sunday' ] ) {
say "I like weekends";
}
};
Вы можете думать о eval
как о try
из других языков; действительно, если вы используете модуль Error из CPAN, вы можете даже записать его по буквам try
. Стоит также отметить, что блочная форма eval (которую я демонстрировал выше) не сопровождается снижением производительности и компилируется вместе с остальным кодом. Строковая форма eval
(которую я не показал) - это совершенно другой зверь, и его следует использовать с осторожностью, если он вообще есть.
eval
технически считается оператором в Perl и, следовательно, является одним из немногих мест, где вы увидите точку с запятой в конце блока. Это легко забыть, если вы не используете eval
регулярно.
Пол