Ngoại lệ trong Yesod


93

Tôi đã tạo một daemon sử dụng một dạng rất nguyên thủy ipc(telnet và gửi một Chuỗi có các từ nhất định theo một thứ tự nhất định). Tôi đã thoát khỏi nó và bây giờ đang sử dụng JSONđể chuyển tin nhắn đến Yesodmáy chủ. Tuy nhiên, có một số điều tôi thực sự thích trong thiết kế của mình và tôi không chắc lựa chọn của mình bây giờ là gì.

Đây là những gì tôi đã làm:

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 ()

mỗi hàm trong buildSeq trông như thế này

foo :: Stage -> ReaderT Config IO ()

data Config = MkConfig (Either JobID Product) BaseDir JobMap

JobMaplà một TMVar Maptheo dõi thông tin về công việc hiện tại.

nên bây giờ, những gì tôi có là Người xử lý, tất cả đều trông như thế này

foo :: Handler RepJson

foo đại diện cho một lệnh cho daemon của tôi, mỗi trình xử lý có thể phải xử lý một đối tượng JSON khác nhau.

Những gì tôi muốn làm là gửi một JSONđối tượng đại diện cho thành công và một đối tượng JSON khác cung cấp thông tin về một số ngoại lệ.

Tôi muốn foohàm trợ giúp của có thể trả về một Either, nhưng tôi không chắc bằng cách nào tôi có được điều đó, cộng với khả năng chấm dứt đánh giá danh sách các hành động của tôi , buildSeq.

Đây là sự lựa chọn duy nhất tôi thấy

1) đảm bảo exceptionHandlerlà trong Handler. Đưa JobMapvào Apphồ sơ. Sử dụng getYesodthay đổi giá trị thích hợp để JobMapchỉ ra chi tiết về ngoại lệ, sau đó có thể được truy cập bằngfoo

Có cách nào tốt hơn?

Những lựa chọn khác của tôi là gì?

Chỉnh sửa: Để rõ ràng, tôi sẽ giải thích vai trò của Handler RepJson. Máy chủ cần một số cách để chấp nhận các lệnh như build stop report. Máy khách cần một số cách để biết kết quả của các lệnh này. Tôi đã chọn JSON làm phương tiện mà máy chủ và máy khách giao tiếp với nhau. Tôi đang sử dụng loại Trình xử lý chỉ để quản lý JSON vào / ra và không có gì hơn.

Câu trả lời:


9

Nói một cách triết học, trong thế giới Haskell / Yesod, bạn muốn chuyển các giá trị về phía trước, thay vì trả chúng trở lại. Vì vậy, thay vì yêu cầu các trình xử lý trả về một giá trị, hãy yêu cầu chúng chuyển tiếp đến bước tiếp theo trong quy trình, có thể tạo ra một ngoại lệ.

Hãy nhớ rằng bạn có thể nhóm bất kỳ số lượng hành động nào trong tương lai vào một đối tượng duy nhất, vì vậy bạn có thể chuyển một đối tượng tiếp tục đến các trình xử lý và foos về cơ bản cho họ biết, "Sau khi bạn hoàn thành, hãy chạy khối mã này." Bằng cách đó, chúng có thể vô hiệu và không trả lại gì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.