Вот суть кода, в который я собираюсь включить обработку ошибок.
worldHandler :: ProcessState -> JobCount -> IO ()
worldHandler world jCount = do
putStrLn "Entered worldHandler"
jcount <- takeMVar jCount
if jcount > 0
then incrementThenDone jcount
else doJobProcessing jcount
where incrementThenDone jcount = do
putMVar jCount (jcount+1)
doJobProcessing jcount = do
putMVar jCount (jcount+1)
preProcess world
initiateJob world
makeChart world
Вот main
.
main :: IO ()
main = do
world <- (newEmptyMVar :: IO ProcessState)
jCount <- (newMVar 0 :: IO JobCount)
installHandler userDefinedSignal1 (Catch $ worldHandler world jCount) Nothing
forever (threadDelay 10000)
Функции preProcess
, initiateJob
и makeChart
- это то, где мне нужно
быть обеспокоенным ошибками. Идея состоит в том, что если какая-либо из этих функций
терпеть неудачу, я уменьшаю jCount
и вызываю logError
. Затем, если jCount > 0
, снова запустите те же три функции. Если jCount == 0
, продолжайте ждать
следующий сигнал.
Каждая из этих функций будет запускать другой процесс,
readProcessWithExitCode
выглядит так, как я хочу. Затем я буду использовать
код выхода для определения успеха или неудачи.
Одна из моих идей заключалась в том, чтобы сделать [preProcess, initiateJob, makeChart]
.
Тогда я бы отобразил функцию jobProcessor
над этим списком. Если один из них
функции получили сбой из программы, которую они вызвали, я мог
сгенерируйте исключение, и карта перестанет отображать список.
Это разумный подход?
Общие идеи о том, как подойти к этому, и любые вопросы, которые приходят
на ум был бы оценен.
Редактировать: В связи с первым заданным вопросом я пересмотрел свое объяснение и отметил, что оно было неполным в важных аспектах. Я думаю заполнены пробелы. Если нет, дайте мне знать.