2009-12-16 55 views
68

我想提出一個異常,以便它執行正常的Rails異常所做的同樣的事情。特別是,在開發模式下顯示異常和堆棧跟蹤,並在生產模式下顯示「我們很抱歉,但出了問題」頁面。如何在Rails中引發異常,使其表現得像其他Rails異常一樣?

我試過如下:

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

但它只是將"ERROR signing up, group missing!"到development.log文件

+2

您發佈的錯誤消息似乎不是來自這個異常(這是一個不同的消息),這真的是你所看到的? – levinalex 2009-12-17 00:31:55

回答

108

你沒有做什麼特別的,它應該只是被工作。

當我有這個控制器新鮮的Rails應用程序:

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

,去http://127.0.0.1:3000/foo/

seeing the exception with a stack trace

你可能不會看到整個堆棧跟蹤在控制檯日誌由於Rails(自2.3)filters lines from the stack trace that come from the framework itself.

見你的Rails項目config/initializers/backtrace_silencers.rb

+2

優秀,簡潔的答案。 – rcd 2014-01-05 22:13:48

+0

skitch鏈接(看到帶有堆棧跟蹤的異常)不再起作用 – Asaf 2016-06-14 12:47:31

+0

@levinalex將在生產模式下安全地顯示堆棧跟蹤? – BKSpurgeon 2016-08-24 04:18:00

49

你可以這樣說:

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)的方式。一個很長的例子,但它應該告訴你它是如何工作的。

最良好的祝願,
費邊

+0

這不會在開發模式下顯示異常和堆棧跟蹤,並在生產模式下顯示「我們很抱歉,但出現了問題」頁面。 – 2009-12-16 23:01:05

+1

「我們很抱歉」頁面實際上是您的Web服務器的500錯誤處理程序。檢查你的.htaccess文件,你通常會看到它 – 2009-12-17 02:55:43

8

如果你需要一個更簡單的方式做到這一點,也不要想小題大做,簡單的執行可能是:

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

這將引發異常,說ee.message = something bad happened!

然後你可以拯救它,因爲你正在拯救所有其他異常。