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


91

例外を発生させて、通常のRails例外と同じことを行いたいと思います。特に、開発モードで例外とスタックトレースを表示し、プロダクションモードで「申し訳ありませんが、問題が発生しました」ページを表示します。

私は以下を試しました:

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

しかし、それは単に"ERROR signing up, group missing!"development.logファイルに書き込みます


2
あなたが投稿したエラーメッセージはこの例外から来たようではありません(それは別のメッセージです)これは本当にあなたが見ているものですか?
levinalex 2009

回答:


139

特別なことをする必要はありません。機能するはずです。

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

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

そしてに行く http://127.0.0.1:3000/foo/

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

Rails(2.3以降)はフレームワーク自体からのスタックトレースからの行をフィルタリングするため、コンソールログにスタックトレース全体が表示されない場合があります

config/initializers/backtrace_silencers.rbRailsプロジェクトで見る


2
優れた簡潔な答え。
rcd 2014年

1
スキップリンク(スタックトレースで例外が表示される)が機能しなくなった
Asaf

@levinalexは、スタックトレースを表示するために本番モードで安全ですか?
BKSpurgeon

@levinalex-アレックスありがとうございます。エラーメッセージにカスタム文字列を追加する方法はありますか?
BKSpurgeon

62

あなたはこのようにそれを行うことができます:

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)で例外をキャッチする方法です。かなり長い例ですが、それがどのように機能するかを示しているはずです。

よろしく、
ファビアン


開発モードでは例外とスタックトレースは表示されず、プロダクションモードでは「申し訳ありませんが、問題が発生しました」ページが表示されます。
Chirag Patel、

2
「申し訳ありません」ページは、実際にはWebサーバーの500エラーハンドラです。.htaccessファイルを確認すると、通常はそこに表示されます
Jeff Paquette、

多分OPへの答えではなく、非常に役立つ例です、ありがとう!
Neil Stockbridge、

11

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

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

これは、例外が発生します、と言うee.message = something bad happened!

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


「例外」自体を発生または救うことはお勧めできません。代わりにStandardErrorを使用してください。詳細については、これを参照してください。stackoverflow.com/questions/10048173/...
Ekamjitシン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.