Правильная обработка двух последовательных UserInterrupt в Haskell - PullRequest
0 голосов
/ 12 ноября 2018

Моя программа выполняет довольно длительные итерационные вычисления ввода-вывода. На каждой итерации я сохраняю промежуточный результат в случае запроса на отключение. По такому запросу я хочу остановить вычисление и распечатать промежуточный результат перед завершением программы. Вот чего я добился, это работает, но когда я нажимаю CTRL-C более одного раза в моем терминале, окончательная печать не выполняется. Это первый раз, когда мне приходится иметь дело с асинхронными исключениями, поэтому я могу ошибаться.

main :: String -> IO ()
main query = uninterruptibleMask $ \restore -> do
  results <- newIORef []
  xe      <- try $ restore $ search query results
  case xe of
    Right x -> printCompleted >> printResults x
    Left  e -> do
      printInterrupted
      readIORef results >>= printResults
      case e of
        UserInterrupt -> return ()
        _             -> throw e

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...