2013-08-06 29 views
0

我做了一個自定義的異常處理程序,並且它在很大程度上工作得非常好。下面是它 - 的要點如何獲取錯誤來源的文件名?

應用程序/錯誤/ 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] 
+1

檢查'msg.backtrace' – Salil

+0

在許多情況下,msg.backtrace爲空。這裏有另一個問題,或者這根本不足以解決問題。 – Crash

+0

@Salil - 事實證明還有另一個阻塞msg.backtrace的錯誤。你的回答是正確的(實際上很久以前就解決了這個問題...)另外,以下是用於追蹤錯誤來源的好工具: 'request.env ['action_controller.instance']。類' 'request.env ['PATH_INFO']' 'request.env ['REQUEST_URI']' – Crash

回答

0

在評論中回答了薩里爾。