Курс языка программирования Raku / Объекты, ввод-вывод и исключения / Исключения / Перехват исключений с помощью try

Не всякая ошибка возникает сразу

По умолчанию брошенное исключение немедленно останавливает программу, и try — это способ его перехватить. Но не всё, что выглядит как фатальная ошибка, действительно останавливает программу в тот же миг. В Raku есть сбои, которые ведут себя тихо: они откладывают свою реакцию до момента, когда вы воспользуетесь результатом, или позволяют их исследовать и продолжить работу. Кое-что из этого в этой части уже встречалось, и стоит собрать всё в одном месте.

Деление на ноль. Деление на ноль не взрывается там, где оно записано. Плохое значение создаётся и тихо хранится; исключение бросается лишь тогда, когда вы им воспользуетесь — например, напечатаете или приведёте к другому типу:

my $x = 1 / 0;    # здесь ошибки нет
say 'still running';
say $x;           # только теперь бросается исключение

Этому отложенному поведению и стоящим за ним объектам Failure посвящены Мягкие сбои.

Неудачно завершившаяся внешняя программа. Proc, возвращённый из run или shell и завершившийся неудачей, не бросает исключение в момент своего появления. Он бросает его, только если вы отбросите его необработанным; сохраните его и прочитайте .exitcode (или проверьте как булево значение) — и сбой останется обычным значением, на которое можно отреагировать. Вы видели это в теме Объект Proc.

Общее здесь вот что: сбой может быть отложен — превращён в значение, которое вы исследуете тогда, когда будете готовы, вместо немедленного падения. try и фазер CATCH имеют дело с ошибками, которые бросаются сразу; эти же механизмы — с теми, которые нет.

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

Перехват исключений с помощью try   |   Перехватите ошибку


💪 Или перейдите сразу к упражнениям этого раздела.