Я использую hedis и пытаюсь обработать случай, когда сервер мертв. Согласно документации:Исключения, которые не попадают в «try»
Подключение к серверу потеряно: В случае потери связи, командные функции бросить ConnectionLostException. Его можно поймать только за пределами runRedis.
Поэтому я бы предположил, что хочу поймать ConnectionLostException. Однако, хотя я могу показаться, что поймал его правильно, он, похоже, тоже поднялся на вершину, и я не уверен, почему. Вот код (только работает в GHCI):
:set -XOverloadedStrings
import Database.Redis
import Control.Exception
conn <- connect defaultConnectInfo
runRedis conn $ ping
Теперь, если я убить сервер Redis между созданием соединения и выполнить команду, я получаю результат я ожидаю:
& Ланголь; интерактивные и rangle ;: ConnectionLost *** Исключение: ConnectionLost
Так вместо этого я пытаюсь сделать следующее (я добавил >>= evaluate
для того, чтобы попытаться заставить оценку ошибки, но это не имеет никакого значения):
let tryR = try :: IO a -> IO (Either ConnectionLostException a)
tryR . (>>= evaluate) . runRedis conn $ ping
Это дает мне:
Left Con: ConnectionLost nectionLost
Так я получаю Left
результат, как и следовало ожидать, но на полпути, за исключением также предположительно поимки и отображается GHCI. Это проблема с не оцененными вещами?
Я не понимаю. Кажется, что все работает правильно для меня: вы превратили исключение в легко проверяемое значение «Либо». Что бы вы ожидали вместо этого? –
Мне кажется, что redis-пакет печатает строку о том, что соединение теряется в дополнение к исключению. –
@ DanielWagner Я конвертирую исключение, но все же (насколько я могу судить), видя, что он обрабатывается GHCI, как будто его все еще бросают. Если это не так, как говорит JohnL, и redis сам печатает сообщение. – Impredicative