2011-05-19 57 views
0

我剛纔幾乎沒有得到進入的Ruby/ROR但需要快速編寫用於處理錯誤,並做一些與他們的類。我已經能夠找到我需要的其餘部分的重要示例/教程,但我無法找到PHP的「set_error_handler」的最佳選擇。紅寶石等同於PHP的的set_error_han dler

我的目標是:

  • 我想編寫一個類,它會自動捕捉任何紅寶石級別的錯誤。
  • 我想爲班級還通過當有自定義錯誤/異常來報告用戶調用。

我希望這項工作適用於任何的ruby應用程序,但我的主要焦點也是針對ruby-on-rails應用程序。謝謝你的建議。

+0

在Ruby中,他們被稱爲例外。 – steenslag 2011-05-19 21:26:04

+0

是否有捕獲_all_異常的標準方法? (沒有嘗試/到處捕捉) – helion3 2011-05-19 21:36:03

回答

0

我認爲Rails中最接近的等效是rescue_from - 它允許你指定的代碼將捕獲任何異常(除了一些模板錯誤 - 儘管有方式圓了)。如果你願意,你可以把它交給其他班級。所以我想你會在你的情況怎麼做纔對:

在app /控制器/ application_controller.rb:

class ApplicationController < ActionController::Base 
    rescue_from Exception do |e| 
    MyExceptionHandler.handle_exception(e) 
    end 
end 
在LIB

/my_exception_handler.rb:

class MyExceptionHandler 
    def self.handle_exception exception 
    # your code goes here 
    end 
end 

如果幫助,讓我知道,我會挖掘鏈接到你如何捕捉模板錯誤。

+0

謝謝,這似乎是我想要的。我會試着讓它知道它是如何工作的。如果您能指出我提到的模板錯誤處理方法,我將不勝感激。 – helion3 2011-05-20 18:25:27

+0

OK,做了 - 這是我第一次聽說rescue_from頁面上也與模板出錯的問題涉及:http://www.perfectline.ee/blog/custom-dynamic-error-pages-in-ruby-on-rails – Simon 2011-05-25 15:40:09

0
begin 
    #require all_kinds_of_things 
    "abc".size(1,2) 
    123.reverse 
    # rest of brilliant app 
rescue Exception => e #Custom, catch-all exeption handler 
    puts "Doh...#{e}" 
    print "Do you want the backtrace? (Y) :" 
    puts e.backtrace if gets.chomp == "Y" 
end 
0

定義ApplicationController#rescue_in_public(exception)並將您的自定義處理代碼放在那裏。

這增強了Rails的默認異常處理在頂層 - 生成HTTP響應權利之前。隨着Rails應用程序的複雜性增加並使用外部資源,將會有更多的異常讓您更加接近拋出異常的位置,但這可以讓您開始。

這種方法只能在HTTP請求工作,不會趕上在您創建通過rails runner執行任何定製耙任務或代碼例外。

下面是從我的應用程序一個例子:

class ApplicationController < ActionController::Base 
    ... 
    protected 

    def rescue_action_in_public (exception) 
    case exception 
    when ActionController::InvalidAuthenticityToken 
     if request.xhr? 
     render :update do |page| 
      page.redirect_to '/sessions/new/' 
     end 
     else 
     redirect_to '/sessions/new/' 
     end 
    when ActionController::NotImplemented 
     RAILS_DEFAULT_LOGGER.info("ActionController::NotImplemented\n#{request.inspect}") 
     render :nothing => true, :status => '500 Error' 
    else 
     super 
    end 
    end 
end