В Ruby, в какие структуры может быть вложено выражение `rescue ' - PullRequest
32 голосов
/ 26 марта 2010

В ruby ​​для отлова ошибки используется оператор rescue. как правило, это утверждение происходит между begin и end. Можно также использовать оператор rescue как часть блока (do ... end) или метод (def ... end). Мой вопрос заключается в том, какие другие структуры (цикл, пока, если, ...), если таковые будут спасать гнездо внутри?

1 Ответ

43 голосов
/ 26 марта 2010

Вы можете использовать спасение только в двух случаях:

  • Внутри блока begin ... end

    begin
      raise
    rescue 
      nil
    end
    
  • как модификатор оператора

    i = raise rescue nil
    

Функции, модули и тела классов (благодаря Jörg) являются неявными begin...end блоками, поэтому вы можете спасаться в любой функции без явного begin / end.

    def foo
      raise
    rescue
      nil
    end

Форма блока принимает необязательный список параметров, определяющих, какие исключения (и потомки) до rescue:

    begin
      eval string
    rescue SyntaxError, NameError => boom
      print "String doesn't compile: " + boom
    rescue StandardError => bang
      print "Error running script: " + bang
    end

Если вызывать inline как модификатор оператора или без аргумента в блоке begin / end, функция спасения перехватит StandardError и его потомков .

Вот документация 1.9 по rescue.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...