2011-03-08 28 views
0

我已經構建了一個在後臺讀取並響應多播請求的小腳本,但似乎在某些請求中它偶爾會崩潰。我一直在使用syslog將不同元素的值記錄到日誌文件中,但是崩潰的原因並未記錄或輸出,因爲它在單獨的線程中作爲後臺進程運行。有沒有什麼辦法可以捕捉到應用程序發生的錯誤(我確實有異常的救援塊,但仍然存在未記錄的問題),並將它作爲後臺進程運行時記錄在某處?從後臺ruby進程記錄錯誤?

+1

這將有助於爲您展現的你如何試圖捕捉例外的例子。 – 2011-03-08 06:07:07

+0

它可能與不沖洗緩衝區有關嗎?我不熟悉ruby中的syslog,但它是否只寫在換行符上? – Seburdis 2011-03-08 06:08:39

回答

1

在你的應用程序中,如果你只是拯救Exception的子類,那麼會出現一些錯誤,提高你不會捕獲的Exception

使用rescue Exception => e並且您應該捕獲引發異常或其子類的所有內容。

Tim Bray有一個很好的一段代碼顯示的異常層次結構,因爲它適用於你的紅寶石和寶石:

exceptions = [] 
tree = {} 
ObjectSpace.each_object(Class) do |cls| 
    next unless cls.ancestors.include? Exception 
    next if exceptions.include? cls 
    next if cls.superclass == SystemCallError # avoid dumping Errno's 
    exceptions << cls 
    cls.ancestors.delete_if {|e| [Object, Kernel].include? e }.reverse.inject(tree) {|memo,cls| memo[cls] ||= {}} 
end 

indent = 0 
tree_printer = Proc.new do |t| 
    t.keys.sort { |c1,c2| c1.name <=> c2.name }.each do |k| 
    space = (' ' * indent); space ||= '' 
    puts space + k.to_s 
    indent += 2; tree_printer.call t[k]; indent -= 2 
    end 
end 
tree_printer.call tree