Как создать исключение в Rails, чтобы он вел себя как другие исключения Rails?

Я хотел бы создать исключение, чтобы оно делало то же самое, что и обычное исключение Rails. Специально, покажите трассировку исключения и стека в режиме разработки и покажите страницу "Мы сожалеем, но что-то пошло не так" в режиме производства.

Я попробовал следующее:

raise "safety_care group missing!" if group.nil?

Но он просто записывает "ERROR signing up, group missing!" в файл development.log

Ответ 1

Вам не нужно ничего делать, он должен просто работать.

Когда у меня есть новое приложение для рельсов с этим контроллером:

class FooController < ApplicationController
  def index
    raise "error"
  end
end

и перейдите к http://127.0.0.1:3000/foo/

Я видя исключение с трассировкой стека.

Возможно, вы не видите весь стек в журнале консоли, потому что Rails (начиная с версии 2.3) фильтрует строки из трассировки стека, которые исходят из самой структуры.

См. config/initializers/backtrace_silencers.rb в проекте Rails

Ответ 2

Вы можете сделать это следующим образом:

class UsersController < ApplicationController
  ## Exception Handling
  class NotActivated < StandardError
  end

  rescue_from NotActivated, :with => :not_activated

  def not_activated(exception)
    flash[:notice] = "This user is not activated."
    Event.new_event "Exception: #{exception.message}", current_user, request.remote_ip
    redirect_to "/"
  end

  def show
      // Do something that fails..
      raise NotActivated unless @user.is_activated?
  end
end

Что вы здесь делаете, это создать класс "NotActivated", который будет использоваться как "Исключение". Используя рейз, вы можете бросить "NotActivated" в качестве исключения. rescue_from - это способ уловить исключение с помощью указанного метода (not_activated в этом случае). Довольно длинный пример, но он должен показать вам, как это работает.

С наилучшими пожеланиями,
Fabian

Ответ 3

Если вам нужен более простой способ сделать это, и вы не хотите много шумихи, простое выполнение может быть:

raise Exception.new('something bad happened!')

Это вызовет исключение, скажем e с e.message = something bad happened!

а затем вы можете спасти его, когда вы спасете все остальные исключения в целом.