我做了一個自定義的異常處理程序,並且它在很大程度上工作得非常好。下面是它 - 的要點如何獲取錯誤來源的文件名?
應用程序/錯誤/ duck.rb
module Duck
def Duck::ReportError(u,c,m,p)
User.send_error_email(u,c,m,p)
User.msg(m)
end
end
應用程序/郵寄/ notifications.rb
def err_report(current_user,err_script,err_msg,err_scrub)
@current_user = current_user
@err_script = err_script
@err_msg = err_msg
@err_scrub = err_scrub
mail(:to => sr_dev, :cc => jr_dev, :subject => "Error Found")
end
而這正是我的問題就在 - 上面的代碼就像現在寫的那樣。消除重複有一些小的變化。我以前做我的電話如下 - 任何錯誤是像這樣的例子,這將被放置在users_controller.rb所有動作中進行處理......
rescue Exception => msg
Duck.ReportError(current_user,"users_controller.rb",msg,"Dumping params: #{params.inspect}")
任何錯誤必然導致鴨子呼叫 - 因此,以前的重複..沒有完成這個。它也完全抹殺乾燥,所以我重新編碼的duck.rb文件,並發現,通過將其放置在應用控制器,任何從ApplicationController繼承而來可能引發像這個 -
rescue_from Exception, :with => :any_error
protected
def any_error(msg)
Duck.ReportError(current_user,"application_controller.rb",msg,"Dumping params: #{params.inspect}")
render "home/duck.erb"
end
的其餘鴨子代碼對於手頭的問題是微不足道的,它是這樣的: 我需要向開發團隊顯示錯誤來自哪個文件。當我第一次製作Duck時,它直接從每個動作/視圖/控制器中調用,如前所示,這是很多重複的,但是具有我可以特別說明哪個腳本產生錯誤的好處。現在我已經對錯誤處理程序進行了一些抽象,這很好 - 但是每次發生錯誤時,例如reports_controller.rb,它都會報告來自application_controller.rb的錯誤。我怎樣才能解決這個問題?我如何得到錯誤的實際來源?
系統:
$ rails -v
Rails 3.0.20
$ ruby -v
ruby 1.8.7 (2012-10-12 patchlevel 371) [x86_64-linux]
檢查'msg.backtrace' – Salil
在許多情況下,msg.backtrace爲空。這裏有另一個問題,或者這根本不足以解決問題。 – Crash
@Salil - 事實證明還有另一個阻塞msg.backtrace的錯誤。你的回答是正確的(實際上很久以前就解決了這個問題...)另外,以下是用於追蹤錯誤來源的好工具: 'request.env ['action_controller.instance']。類' 'request.env ['PATH_INFO']' 'request.env ['REQUEST_URI']' – Crash