2014-01-27 90 views
6

我使用hedis並試圖處理服務器死機的情況。根據文檔:例外情況未被'嘗試'捕獲

連接到服務器丟失: 在連接丟失的情況下,命令函數會拋出ConnectionLostException。它只能在runRedis之外被捕獲。

所以我會假設我想趕上ConnectionLostException。然而,雖然我似乎能夠正確地看到它,但它似乎也會泡到頂端,我不知道爲什麼。下面是一些代碼(只是GHCI運行):

:set -XOverloadedStrings 
import Database.Redis 
import Control.Exception 

conn <- connect defaultConnectInfo 
runRedis conn $ ping 

現在,如果我殺了進行連接和運行命令之間Redis的服務器,我得到的結果,我希望:

&langle;互動&rangle ;:ConnectionLost ***例外:ConnectionLost

所以不是我嘗試做如下(我爲了增加>>= evaluate試圖迫使錯誤的評估,但它並沒有區別):

let tryR = try :: IO a -> IO (Either ConnectionLostException a) 
tryR . (>>= evaluate) . runRedis conn $ ping 

這給了我:

左缺點:ConnectionLost nectionLost

所以我得到Left結果作爲預期,但中途異常也可能被抓並由GHCI顯示。這是沒有被評估的事情嗎?

+3

我不明白。一切似乎對我來說都是正確的:您已將異常轉換爲易於檢查的「Either」值。你預計會發生什麼? –

+1

它看起來像redis包是打印一個關於丟失的連接的字符串,除了拋出異常。 –

+0

@DanielWagner我正在轉換異常,但仍然(據我所知)看到它由GHCI處理,就好像它仍然被拋出一樣。除非JohnL說,並且redis本身正在打印該信息。 – Impredicative

回答

1

像約翰暗示的那樣,似乎有些東西會將此消息打印到stderr

考慮這個例子:

{-# LANGUAGE OverloadedStrings #-} 

import Control.Concurrent (threadDelay) 
import Control.Exception 
import Control.Monad 
import Database.Redis 
import System.Mem 

tryR :: IO a -> IO (Either ConnectionLostException a) 
tryR = try 


main :: IO() 
main = do 
    conn <- connect defaultConnectInfo 
    loop conn 
    putStrLn $ "exiting gracefully after counting up some numbers" 
    performGC 
    forM_ [1..10] $ \i -> do 
    print i 
    threadDelay 10000 -- 0.05 seconds 
    where 
    loop conn = do 

     e <- tryR . (>>= evaluate) . runRedis conn $ ping 

     case e of 
     Right x -> do print x 
         threadDelay 1000000 
         loop conn 
     Left err -> do putStrLn $ "tryR caught exception: " ++ show err 

它打印:

Right Pong 
Right Pong <-------------- after this I Ctrl-C the redis server 
tryR caught exception: ConnectionLost 
exiting gracefully after counting up some numbers 
1 
test: ConnectionLost 
2 
3 
4 
5 
6 
7 
8 
9 
10 

這看起來像是在棧(如果你使用GHCI/runghc或test.hs: ConnectionLost)是印刷本test: ConnectionLost異步

如果這是GHC,這可能是一個錯誤,但機會很高,它由hedis或其依賴項之一完成(我自己還沒有發現它在hedis本身)。

+0

另外,考慮爲[hedis](https://github.com/informatikr/hedis/issues)打開一個問題來澄清它是hedis還是它的一個依賴關係。 – nh2