Ответ 1
Aiui ваш вопрос:
I'm looking for
use autodie qw(:all)
&use warnings 'FATAL' => 'all'
in Perl6
Эквивалент autodie
в P6
Aiui use autodie qw(:all)
в P5 становится use fatal;
в P6. Это лексически ограниченный эффект.
Раздел autodie
в руководстве по скорлупе P5-P6 объясняет, что процедуры теперь возвращают Failure
, чтобы указать на ошибки.
Прагма fatal
заставляет возвращать Failure
из подпрограммы автоматически генерировать исключение, содержащее Failure
. Если вы не предоставите код, который их перехватит, эти исключения, заключающие в оболочку Failure
, автоматически исчезнут.
Эквивалент use warnings 'FATAL'
в P6
Aiui use warnings 'FATAL' => 'all'
в P5 становится CONTROL { when CX::Warn { note $_; exit 1 } }
в P6. Это лексически ограниченный эффект.
CONTROL
Исключения объясняют, как они работают.
Исключения CONTROL
- это подмножество всех исключений, которые по умолчанию .resume
d - программа остается в живых по умолчанию, когда их выдают.
Приведенный мною код P6 (который взят из Как я могу сделать все предупреждения фатальными?, на который вы ссылались) вместо этого приводит к смерти исключений CONTROL
(из-за exit
рутина).
Возвращаясь к текущему тексту вопроса:
say %key<fake_key>; # (Any)
Я хочу, чтобы программа умерла в таких случаях...
Используйте либо ответ Jonathan++ (используйте put
, который, в отличие от say
, не пытается поддерживать вашу программу)), либо ответ Scimon++ KeyRequired
, который сделает доступ к несуществующему ключу фатальным.
... as Perl5 does...
Только если вы используете use warnings 'FATAL' ...
, так же, как P6, если вы используете эквивалент.
... потому что это означает, что важные данные отсутствуют.
Часто это означает, что неважные данные отсутствуют или даже важные данные, которые вы не хотите, определяли в течение некоторого времени, когда вы пытаетесь получить к ним доступ, поэтому Perls по умолчанию поддерживает вашу программу в живых и требует, чтобы вы указали ей то, что вы хотите, если вам что-то нужно отличается.
Вы можете использовать вышеупомянутые конструкции, чтобы получить точный желаемый результат, и они будут ограничены данной переменной (если вы используете роль KeyRequired
) или оператором (используя put
вместо say
) или лексической областью действия ( используя прагму или блок CONTROL
).