ข้อยกเว้นใน Yesod


93

ฉันได้สร้างภูตที่ใช้รูปแบบดั้งเดิมของipc(เทลเน็ตและส่งสตริงที่มีคำบางคำตามลำดับ) ฉันหักออกและตอนนี้กำลังใช้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ที่ติดตามข้อมูลเกี่ยวกับงานปัจจุบัน

ตอนนี้สิ่งที่ฉันมีคือ Handlers ซึ่งทั้งหมดมีลักษณะเช่นนี้

foo :: Handler RepJson

foo แทนคำสั่งสำหรับ daemon ของฉันตัวจัดการแต่ละตัวอาจต้องประมวลผลออบเจ็กต์ JSON ที่แตกต่างกัน

สิ่งที่ฉันต้องการทำคือส่งJSONออบเจ็กต์หนึ่งที่แสดงถึงความสำเร็จและออบเจ็กต์ JSON อีกอันที่บีบอัดข้อมูลเกี่ยวกับข้อยกเว้นบางอย่าง

ฉันต้องการfooฟังก์ชันช่วยที่จะสามารถที่จะกลับแต่ผมไม่แน่ใจว่าวิธีการที่ฉันได้รับที่บวกกับความสามารถในการยุติการประเมินผลของรายการของฉันของการกระทำEitherbuildSeq

นี่เป็นทางเลือกเดียวที่ฉันเห็น

1) ตรวจสอบให้แน่ใจว่าexceptionHandlerอยู่ใน Handler ใส่JobMapในAppบันทึก ใช้getYesodแก้ไขค่าที่เหมาะสมในการJobMapระบุรายละเอียดเกี่ยวกับข้อยกเว้นซึ่งสามารถเข้าถึงได้โดยfoo

มีวิธีที่ดีกว่า?

ตัวเลือกอื่น ๆ ของฉันคืออะไร?

แก้ไข: Handler RepJsonเพื่อความชัดเจนผมจะอธิบายบทบาทของ เซิร์ฟเวอร์ต้องการวิธีบางอย่างในการยอมรับคำสั่งเช่นbuild stop report. ไคลเอนต์ต้องการวิธีที่จะทราบผลลัพธ์ของคำสั่งเหล่านี้ ฉันเลือก JSON เป็นสื่อกลางที่เซิร์ฟเวอร์และไคลเอนต์สื่อสารกัน ฉันใช้ประเภท Handler เพื่อจัดการ JSON เข้า / ออกและไม่มีอะไรเพิ่มเติม

คำตอบ:


9

พูดตามหลักปรัชญาในโลก Haskell / Yesod คุณต้องการส่งต่อค่านิยมไปข้างหน้าแทนที่จะส่งกลับไปข้างหลัง ดังนั้นแทนที่จะให้ตัวจัดการส่งคืนค่าให้เรียกส่งต่อไปยังขั้นตอนถัดไปในกระบวนการซึ่งอาจเป็นการสร้างข้อยกเว้น

โปรดจำไว้ว่าคุณสามารถรวมการดำเนินการในอนาคตจำนวนเท่าใดก็ได้ไว้ในออบเจ็กต์เดียวดังนั้นคุณจึงสามารถส่งอ็อบเจกต์ต่อเนื่องไปยังตัวจัดการและ foos ของคุณซึ่งโดยพื้นฐานแล้วจะบอกพวกเขาว่า "หลังจากเสร็จสิ้นให้รันโค้ดหยดนี้" ด้วยวิธีนี้พวกเขาสามารถเป็นโมฆะและไม่มีอะไรกลับคืนมา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.