Курс языка программирования Raku / Объекты, ввод-вывод и исключения / Исключения / Перехват исключений с помощью
try
Не всякая ошибка возникает сразу
По умолчанию брошенное исключение немедленно останавливает программу,
и try — это способ его перехватить. Но не всё, что выглядит
как фатальная ошибка, действительно останавливает программу в тот же
миг. В Raku есть сбои, которые ведут себя тихо: они откладывают свою
реакцию до момента, когда вы воспользуетесь результатом, или позволяют
их исследовать и продолжить работу. Кое-что из этого в этой части уже
встречалось, и стоит собрать всё в одном месте.
Деление на ноль. Деление на ноль не взрывается там, где оно записано. Плохое значение создаётся и тихо хранится; исключение бросается лишь тогда, когда вы им воспользуетесь — например, напечатаете или приведёте к другому типу:
my $x = 1 / 0; # здесь ошибки нет
say 'still running';
say $x; # только теперь бросается исключениеЭтому отложенному поведению и стоящим за ним объектам
Failure посвящены Мягкие
сбои.
Неудачно завершившаяся внешняя программа.
Proc, возвращённый из run или
shell и завершившийся неудачей, не бросает исключение в
момент своего появления. Он бросает его, только если вы
отбросите его необработанным; сохраните его и прочитайте
.exitcode (или проверьте как булево значение) — и сбой
останется обычным значением, на которое можно отреагировать. Вы видели
это в теме Объект
Proc.
Общее здесь вот что: сбой может быть отложен — превращён в
значение, которое вы исследуете тогда, когда будете готовы, вместо
немедленного падения. try и фазер CATCH имеют
дело с ошибками, которые бросаются сразу; эти же механизмы — с теми,
которые нет.
Навигация по курсу
← Перехват исключений с помощью
try | Перехватите ошибку
→
💪 Или перейдите сразу к
упражнениям этого раздела.