web-dev-qa-db-ja.com

Railsで例外を発生させて、他のRails例外のように動作させるにはどうすればよいですか?

通常のRails例外と同じことを行うように、例外を発生させたいと思います。特に、開発モードで例外とスタックトレースを表示し、本番モードで「申し訳ありませんが、何か問題が発生しました」ページを表示します。

私は次を試しました:

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

ただし、単に"ERROR signing up, group missing!"をdevelopment.logファイルに書き込みます

89
Chirag Patel

特別なことをする必要はありません。それはただ機能しているはずです。

このコントローラーを備えた新しいRailsアプリがある場合:

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

http://127.0.0.1:3000/foo/に移動します

スタックトレースで例外が発生しています。

Rails(2.3以降) フレームワーク自体からのスタックトレースから行をフィルタリングします。

Railsプロジェクトのconfig/initializers/backtrace_silencers.rbを参照してください

132
levinalex

次のようにできます:

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」クラスを作成することです。 raiseを使用すると、「NotActivated」を例外としてスローできます。 rescue_fromは、指定されたメソッド(この場合はnot_activated)で例外をキャッチする方法です。かなり長い例ですが、どのように機能するかを示す必要があります。

ご多幸を祈る、
ファビアン

60
halfdan

より簡単な方法が必要で、大騒ぎしたくない場合は、次のように簡単に実行できます。

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

これにより、例外が発生します。たとえば、e with e.message = something bad happened!

そして、一般的に他のすべての例外を救出しているので、それを救うことができます。

10
Sambhav Sharma