我使用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顯示。這是沒有被評估的事情嗎?
我不明白。一切似乎對我來說都是正確的:您已將異常轉換爲易於檢查的「Either」值。你預計會發生什麼? –
它看起來像redis包是打印一個關於丟失的連接的字符串,除了拋出異常。 –
@DanielWagner我正在轉換異常,但仍然(據我所知)看到它由GHCI處理,就好像它仍然被拋出一樣。除非JohnL說,並且redis本身正在打印該信息。 – Impredicative