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

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

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

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

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

Ответы [ 3 ]

130 голосов
/ 17 декабря 2009

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

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

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-проекте

60 голосов
/ 17 декабря 2009

Вы можете сделать это так:

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

То, что вы здесь делаете, - это создание класса NotActivation, который будет служить исключением. Используя рейз, вы можете выбросить «Неактивированный» как исключение. rescue_from - это способ перехвата исключения с помощью указанного метода (в этом случае not_activation). Довольно длинный пример, но он должен показать вам, как это работает.

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

8 голосов
/ 18 ноября 2016

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

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

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

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

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