Spec-Zone.ru › Ruby on Rails 8.1

module ActiveSupport::Rescuable::ClassMethods

Открытые методы экземпляра

rescue_from (*klasses, with: nil, &block) Показать исходный код
# File activesupport/lib/active_support/rescuable.rb, line 53
def rescue_from(*klasses, with: nil, &block)
  unless with
    if block_given?
      with = block
    else
      raise ArgumentError, "Need a handler. Pass the with: keyword argument or provide a block."
    end
  end

  klasses.each do |klass|
    key = if klass.is_a?(Module) && klass.respond_to?(:===)
      klass.name
    elsif klass.is_a?(String)
      klass
    else
      raise ArgumentError, "#{klass.inspect} must be an Exception class or a String referencing an Exception class"
    end

    # Put the new handler at the end because the list is read in reverse.
    self.rescue_handlers += [[key, with]]
  end
end

Регистрирует классы исключений с обработчиком, который будет вызван методом rescue_with_handler.

rescue_from принимает ряд классов исключений или имён классов и обработчик исключения, указанный с помощью завершающего параметра :with, содержащего имя метода или объект Proc. В качестве обработчика также можно передать блок.

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

Обработчики наследуются. Поиск выполняется справа налево, снизу вверх и вверх по иерархии. Вызывается обработчик первого класса, для которого выполняется условие exception.is_a?(klass), если такой обработчик есть.

class ApplicationController < ActionController::Base
  rescue_from User::NotAuthorized, with: :deny_access
  rescue_from ActiveRecord::RecordInvalid, with: :show_record_errors

  rescue_from "MyApp::BaseError" do |exception|
    redirect_to root_url, alert: exception.message
  end

  private
    def deny_access
      head :forbidden
    end

    def show_record_errors(exception)
      redirect_back_or_to root_url, alert: exception.record.errors.full_messages.to_sentence
    end
end

Исключения, возникающие внутри обработчиков исключений, не передаются выше по стеку.

rescue_with_handler (exception, object: self, visited_exceptions: []) Показать исходный код
# File activesupport/lib/active_support/rescuable.rb, line 90
def rescue_with_handler(exception, object: self, visited_exceptions: [])
  visited_exceptions << exception

  if handler = handler_for_rescue(exception, object: object)
    handler.call exception
    exception
  elsif exception
    if visited_exceptions.include?(exception.cause)
      nil
    else
      rescue_with_handler(exception.cause, object: object, visited_exceptions: visited_exceptions)
    end
  end
end

Сопоставляет исключение с обработчиком на основе класса исключения.

Если обработчик для исключения не найден, выполняется поиск обработчика для (необязательной) причины исключения exception.cause. Если обработчик не найден ни для исключения, ни для его причины, возвращается nil, чтобы можно было обработать необработанные исключения. Если вы ожидаете такого поведения, обязательно повторно вызовите необработанные исключения.

begin
  # ...
rescue => exception
  rescue_with_handler(exception) || raise
end

Возвращает исключение, если оно было обработано, и nil, если нет.

© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API