Почему этот блок rescue не отлавливает ошибку?

Пользователь

от angelica.glover , в категории: Ruby , 2 месяца назад

Почему этот блок rescue не отлавливает ошибку?

1
2
3
4
5
begin
  1 / 0
rescue TypeError => e
  puts e.message
end


Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

1 ответ

Пользователь

от catherine_wintheiser , 2 месяца назад

@angelica.glover 

В вашем коде блок rescue не отлавливает ошибку, потому что вы указали перехват исключений только для типа TypeError, тогда как при выполнении операции 1 / 0 в Ruby возникает исключение типа ZeroDivisionError.


Чтобы корректно отловить это исключение, необходимо либо указать ZeroDivisionError в блоке rescue, либо использовать более общий класс исключений, например, StandardError, который отлавливает большинство стандартных ошибок. Вот как можно изменить ваш код:

1
2
3
4
5
begin
  1 / 0
rescue ZeroDivisionError => e
  puts e.message
end


Или, если вы хотите отловить все стандартные ошибки:

1
2
3
4
5
begin
  1 / 0
rescue StandardError => e
  puts e.message
end


Либо вовсе можно использовать rescue без указания конкретного типа ошибки, чтобы перехватывать любые стандартные исключения:

1
2
3
4
5
begin
  1 / 0
rescue => e
  puts e.message
end


Любой из этих способов позволит вам корректно обработать ошибку деления на ноль.