Винятки в Єсоді


93

Я створив демон, який використовував дуже примітивну форму 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з функцією помічника , щоб мати можливість повертати Either, але я не знаю , як я розумію , що, плюс можливість завершити оцінку мого списку дій, buildSeq.

Ось єдиний вибір, який я бачу

1) переконайтеся, що exceptionHandlerзнаходиться в Handler. Помістіть JobMapв Appзапис. Використовуючи getYesodalter відповідне значення для JobMapзазначення деталей про виняток, до якого потім можна отримати доступfoo

Чи є кращий спосіб?

Які мої інші варіанти?

Редагувати: Для наочності я пояснить роль Handler RepJson. Сервер потребує певного способу прийому таких команд, як build stop report. Клієнт потребує певного способу знати результати цих команд. Я вибрав JSON як засіб, за допомогою якого сервер і клієнт спілкуються між собою. Я використовую тип Handler просто для управління входом / виходом JSON і не більше того.

Відповіді:


9

Філософічно кажучи, у світі Хаскелла / Єсода ви хочете передавати значення вперед, а не повертати їх назад. Отже, замість того, щоб обробники повертали значення, запропонуйте їм зателефонувати на наступний етап процесу, який може полягати у створенні винятку.

Пам’ятайте, що ви можете об’єднати будь-яку кількість майбутніх дій в один об’єкт, щоб ви могли передати об’єкт продовження своїм обробникам та foo-файлам, що в основному говорить їм: «Після того, як ви закінчите, запустіть цей блок-код коду». Таким чином вони можуть бути недійсними і нічого не повернути.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.