我想提出一個異常,以便它執行正常的Rails異常所做的同樣的事情。特別是,在開發模式下顯示異常和堆棧跟蹤,並在生產模式下顯示「我們很抱歉,但出了問題」頁面。如何在Rails中引發異常,使其表現得像其他Rails異常一樣?
我試過如下:
raise "safety_care group missing!" if group.nil?
但它只是將"ERROR signing up, group missing!"
到development.log文件
我想提出一個異常,以便它執行正常的Rails異常所做的同樣的事情。特別是,在開發模式下顯示異常和堆棧跟蹤,並在生產模式下顯示「我們很抱歉,但出了問題」頁面。如何在Rails中引發異常,使其表現得像其他Rails異常一樣?
我試過如下:
raise "safety_care group missing!" if group.nil?
但它只是將"ERROR signing up, group missing!"
到development.log文件
你沒有做什麼特別的,它應該只是被工作。
當我有這個控制器新鮮的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
優秀,簡潔的答案。 – rcd 2014-01-05 22:13:48
skitch鏈接(看到帶有堆棧跟蹤的異常)不再起作用 – Asaf 2016-06-14 12:47:31
@levinalex將在生產模式下安全地顯示堆棧跟蹤? – BKSpurgeon 2016-08-24 04:18:00
你可以這樣說:
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)的方式。一個很長的例子,但它應該告訴你它是如何工作的。
最良好的祝願,
費邊
這不會在開發模式下顯示異常和堆棧跟蹤,並在生產模式下顯示「我們很抱歉,但出現了問題」頁面。 – 2009-12-16 23:01:05
「我們很抱歉」頁面實際上是您的Web服務器的500錯誤處理程序。檢查你的.htaccess文件,你通常會看到它 – 2009-12-17 02:55:43
如果你需要一個更簡單的方式做到這一點,也不要想小題大做,簡單的執行可能是:
raise Exception.new('something bad happened!')
這將引發異常,說e
與e.message = something bad happened!
然後你可以拯救它,因爲你正在拯救所有其他異常。
您發佈的錯誤消息似乎不是來自這個異常(這是一個不同的消息),這真的是你所看到的? – levinalex 2009-12-17 00:31:55