Вопрос

Я просматривал книгу по программированию на Ruby, и у меня возникли проблемы с пониманием следующих концепций:

  1. Авторы рассказывают о "временных исключениях", которые могут возникать в коде, а затем предлагают создать ваш собственный объект exception для их обработки.Я не думаю, что я полностью понимаю, что такое временная ошибка и когда целесообразно создать свой собственный объект Exception.Он говорит об этом в Глава 6 когда он говорит об определении исключений:

Например, некоторые типы сетевых ошибок могут быть временными.Глава 6.Страница 97.Добавление информации в исключения.

  1. Мне также трудно разобраться с использованием Catch и Throw в ruby.Когда это может быть лучше, чем растить и спасать?
Это было полезно?

Решение

Можете ли вы дать нам ссылку на страницу со строкой "временные исключения"?

В любом случае, вы можете создать новое исключение в любое время, и обычно это полезно сделать, чтобы вы могли передать больше информации о неисправности.Это особенно хорошо, когда у вас есть исключение низкого уровня и вы хотите превратить его во что-то более значимое для пользователя.

Throw / Catch в Ruby на самом деле являются своего рода нелокальным goto, как setjmp / longjmp в C, но лучше управляются.Вы могли бы использовать его в любое время, когда захотите значительно ускорить выполнение.

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


Ладно, кажется, этого нет на странице 97 ни в одном из имеющихся у меня изданий книги "Кирка", но я понимаю, что это значит....о, вот она, страница 157 в третьем издании.

Прежде всего, что касается "переходного процесса", есть некоторые сетевые проблемы, которые могут возникнуть, а затем разрешиться сами собой, скажем, когда BOFH отсоединяет сетевой кабель и подключает его обратно.Поэтому, при некоторых условиях, вы можете захотеть дать ему несколько секунд успокоиться и повторить попытку, прежде чем паниковать.как бы вы это сделали?

В этом случае они попросят вас определить новый тип исключения.Это делается только с помощью наследования:

class RetryException < RuntimeError
  # so this is a kind of RuntimeError which is a kind of Exception
  attr: ok_to_retry
  def initialize(ok_to_retry)
     @ok_to_retry
  end
end

таким образом, если что-то пойдет не так, вы можете вызвать одно из этих новых исключений с возможностью повторной попытки

raise RetryException.new(true), "transient read error"

который теперь отправляет что-то вроде RuntimeError вверх по стеку, но теперь к нему прикреплена дополнительная информация, т. Е. флаг, который говорит "да, это можно повторить".

Итак, вот действительно изящно вещь в Ruby:у него есть встроенная возможность повторить некоторые действия.Итак, где-то в верхней части стека у вас есть этот код:

begin
   # do something that raises this exception
   do_something()
rescue RetryException => detail 
   # if the exception is one of these retryable ones, 
   # catch it here, but it in detail
   if detail.ok_to_retry  
      retry
   end
   # this means exactly the same as 'retry if detail.ok_to_retry`
   # from the book, btw

   # if it STILL doesn't work, send the exception on
   raise # just re-raises the last exception
end
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top