Yesod'daki istisnalar


93

Çok ilkel bir biçim ipc(telnet ve belirli kelimeleri belirli bir sırayla içeren bir String gönder) kullanan bir arka plan programı oluşturmuştum . Bundan kurtuldum ve şimdi JSONiletileri bir Yesodsunucuya iletmek için kullanıyorum . Ancak, tasarımımda gerçekten sevdiğim bazı şeyler vardı ve şu anda seçimlerimin ne olduğundan emin değilim.

İşte yaptığım şey:

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'teki her işlev şöyle görünüyordu

foo :: Stage -> ReaderT Config IO ()

data Config = MkConfig (Either JobID Product) BaseDir JobMap

JobMapBir olan TMVar Mapcari işler hakkında o izler bilgiler.

öyleyse şimdi, elimde olan İşleyiciler, hepsi buna benziyor

foo :: Handler RepJson

foo arka plan programım için bir komutu temsil ediyor, her işleyicinin farklı bir JSON nesnesini işlemesi gerekebilir.

Yapmak istediğim şey, JSONbaşarıyı temsil eden bir nesne ve bazı istisnalar hakkında bilgi veren başka bir JSON nesnesi göndermek.

Ben istiyorum fooın yardımcı işlevi bir dönüş yapabilmek için Either, ama ben, bu olsun, artı eylemlerin listemde değerlendirilmesi sonlandırmak için yeteneği emin değilim buildSeq.

İşte gördüğüm tek seçenek

1) exceptionHandlerİşleyicide olduğundan emin olun . Put JobMapin Apprekor. Kullanımı getYesoduygun değeri değiştirmez JobMapsonra ulaşılabilir durum hakkında detayları gösteren,foo

Daha iyi bir yol var mı?

Diğer seçeneklerim neler?

Düzenleme: Netlik için rolünü açıklayacağım Handler RepJson. Sunucunun, gibi komutları kabul etmesi için bir yola ihtiyacı var build stop report. Müşterinin bu komutların sonuçlarını bilmek için bir şekilde ihtiyacı vardır. Sunucu ve istemcinin birbiriyle iletişim kurduğu ortam olarak JSON'u seçtim. İşleyici türünü sadece JSON giriş / çıkışını yönetmek için kullanıyorum ve daha fazlasını yapmıyorum.

Yanıtlar:


9

Felsefi olarak konuşursak, Haskell / Yesod dünyasında değerleri geri döndürmek yerine ileriye aktarmak istersiniz. Bu nedenle, işleyicilerin bir değer döndürmesi yerine, işlemin bir istisna oluşturabilecek bir sonraki adıma ilerlemesini sağlayın.

Gelecekteki herhangi bir eylemi tek bir nesnede toplayabileceğinizi unutmayın, böylece işleyicilerinize ve foos'larınıza temelde "İşiniz bittikten sonra bu kod bloğunu çalıştırın" diyen bir devam nesnesi geçirebilirsiniz. Bu şekilde geçersiz olabilirler ve hiçbir şey geri veremezler.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.