2017-07-31 63 views
0

我正在使用火鳥數據庫gem來連接到用戶指定的數據庫。只要用戶提供正確的數據,它就可以正常工作。如果沒有,gem無法連接,並且在gem拋出異常之前需要很長時間。我試圖使用超時:像這樣的超時:Ruby超時不​​超時

database = Fb:Database(connection_data) 
Timeout::timeout(5) do 
    database.connect #that's the part that takes long to connect 
end 

但它不超時。它只是等待(這是一個漫長的等待,超過一分鐘),並拋出寶石異常(它不是超時異常)。看起來代碼執行時間低於5秒(根據Timeout),除了它花了1-2分鐘。我一直在尋找一個解釋(檢查源代碼),但沒有找到任何解釋。我真的不想修復它(因爲無論如何它都會被延遲工作),但我想知道爲什麼,以及如何忽略Timeout。

此外,下面的代碼工作正常。

Timeout::timeout(5) do 
    sleep(10) 
end 

回答

0

超時塊運行在一個新的線程代碼,當timeout 5秒後發生,異常有力地提高(Thread.raise我相信)進入運行database.connect線程。 (Timeout module code

這種中斷可能發生在任何線路上;在這種情況下,它可能在某種救援塊中(並在之後拋出自定義錯誤),或者無法正確處理它的任何地方,從而使其處於無效狀態。圖書館不可能在任何地方防禦地編碼

您可以閱讀更多關於在this Reddit thread中使用Timeout::timeout的問題。