0
我已經構建了一個在後臺讀取並響應多播請求的小腳本,但似乎在某些請求中它偶爾會崩潰。我一直在使用syslog將不同元素的值記錄到日誌文件中,但是崩潰的原因並未記錄或輸出,因爲它在單獨的線程中作爲後臺進程運行。有沒有什麼辦法可以捕捉到應用程序發生的錯誤(我確實有異常的救援塊,但仍然存在未記錄的問題),並將它作爲後臺進程運行時記錄在某處?從後臺ruby進程記錄錯誤?
我已經構建了一個在後臺讀取並響應多播請求的小腳本,但似乎在某些請求中它偶爾會崩潰。我一直在使用syslog將不同元素的值記錄到日誌文件中,但是崩潰的原因並未記錄或輸出,因爲它在單獨的線程中作爲後臺進程運行。有沒有什麼辦法可以捕捉到應用程序發生的錯誤(我確實有異常的救援塊,但仍然存在未記錄的問題),並將它作爲後臺進程運行時記錄在某處?從後臺ruby進程記錄錯誤?
在你的應用程序中,如果你只是拯救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
這將有助於爲您展現的你如何試圖捕捉例外的例子。 – 2011-03-08 06:07:07
它可能與不沖洗緩衝區有關嗎?我不熟悉ruby中的syslog,但它是否只寫在換行符上? – Seburdis 2011-03-08 06:08:39