Исключения в Есоде


я создал демона, который использовал очень примитивную форму ipc (telnet и отправить строку, которая имела определенные слова в определенном порядке). Я вырвался из него и теперь использую JSON для передачи сообщения Yesod сервер. Тем не менее, были некоторые вещи, которые мне очень понравились в моем дизайне, и я не уверен, что мой выбор сейчас.

вот что я делал:

buildManager :: Phase -> IO ()
buildManager phase = do
  let buildSeq = findSeq phase
      jid = JobID $ pack "8"
      config = MkConfig $ Just jid
  flip C.catch exceptionHandler $ 
  runReaderT (sequence_ $ buildSeq <*> stages) config
  -- ^^ I would really like to keep the above line of code, or something like it.
  return ()

каждая функция в buildSeq выглядела так

foo :: Stage -> ReaderT Config IO ()

data Config = MkConfig (Either JobID Product) BaseDir JobMap

JobMap - это TMVar Map это отслеживает информацию о текущих заданиях.

Итак, теперь у меня есть обработчики, которые все выглядят так

foo :: Handler RepJson

foo представляет команду для моего демона, каждый обработчик может обрабатывать другой JSON-объект.

то, что я хотел бы сделать, это отправить один JSON объект, представляющий успех,и другой объект JSON, который содержит информацию о некотором исключении.

я бы fooвспомогательная функция s, котор нужно быть возможность вернуть Either, но я не уверен, как я получаю это, плюс возможность прекратить оценку моего списка действий,buildSeq.

вот единственный выбор, который я вижу

1) Убедитесь, что exceptionHandler в обработчик. Поставить JobMap на App запись. Используя getYesod измените соответствующее значение в JobMap указание сведений об исключении, который затем может быть доступен по foo

есть ли лучший способ?

Каковы мои другие выбор?

Edit: для ясности я объясню рольHandler RepJson. Сервер должен каким-то образом принимать команды, такие как buildstopreport. Клиент должен знать результаты этих команд. Я выбрал JSON в качестве среды, с которой сервер и клиент общаются друг с другом. Я использую тип обработчика только для управления JSON in / out и ничего больше.

1 93

1 ответ:

философски говоря, в мире Haskell/Yesod вы хотите передать значения вперед, а не возвращать их назад. Поэтому вместо того, чтобы обработчики возвращали значение, попросите их вызвать вперед к следующему шагу процесса, который может заключаться в создании исключения.

помните, что вы можете связать любое количество будущих действий в один объект, поэтому вы можете передать объект продолжения своим обработчикам и foos, который в основном говорит им: "после того, как вы закончите, запустите это двоичный код.- Таким образом, они могут быть пустыми и ничего не возвращать.