Моя программа выполняет довольно длительные итерационные вычисления ввода-вывода. На каждой итерации я сохраняю промежуточный результат в случае запроса на отключение. По такому запросу я хочу остановить вычисление и распечатать промежуточный результат перед завершением программы. Вот чего я добился, это работает, но когда я нажимаю 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
Спасибо!