Исключения в Есоде
я создал демона, который использовал очень примитивную форму 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
. Сервер должен каким-то образом принимать команды, такие как build
stop
report
. Клиент должен знать результаты этих команд. Я выбрал JSON в качестве среды, с которой сервер и клиент общаются друг с другом. Я использую тип обработчика только для управления JSON in / out и ничего больше.
1 ответ:
философски говоря, в мире Haskell/Yesod вы хотите передать значения вперед, а не возвращать их назад. Поэтому вместо того, чтобы обработчики возвращали значение, попросите их вызвать вперед к следующему шагу процесса, который может заключаться в создании исключения.
помните, что вы можете связать любое количество будущих действий в один объект, поэтому вы можете передать объект продолжения своим обработчикам и foos, который в основном говорит им: "после того, как вы закончите, запустите это двоичный код.- Таким образом, они могут быть пустыми и ничего не возвращать.