यशोद में अपवाद


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वर्तमान नौकरियों के बारे में है कि पटरियों जानकारी।

इसलिए अब, मेरे पास हैंडलर हैं, जो सभी इस तरह दिखते हैं

foo :: Handler RepJson

foo मेरे डेमॉन के लिए एक कमांड का प्रतिनिधित्व करता है, प्रत्येक हैंडलर को एक अलग JSON ऑब्जेक्ट को संसाधित करना पड़ सकता है।

जो मैं करना चाहता हूं वह एक JSONवस्तु भेजना है जो सफलता का प्रतिनिधित्व करती है, और एक और JSON ऑब्जेक्ट जो कुछ अपवाद के बारे में जानकारी की जासूसी करता है।

मैं चाहूंगा कि fooहेल्पर फंक्शन को वापस करने में सक्षम हो Either, लेकिन मुझे यकीन नहीं है कि मुझे यह कैसे मिलेगा, साथ ही, मेरे कार्यों की सूची के मूल्यांकन को समाप्त करने की क्षमता buildSeq

यहाँ एकमात्र विकल्प है जो मैं देख रहा हूँ

1) सुनिश्चित करें कि exceptionHandlerहैंडलर में है। रिकॉर्ड JobMapमें डाल Appदिया। अपवाद के बारे में विवरणों getYesodको JobMapइंगित करने में उचित मूल्य में परिवर्तन का उपयोग करना , जिसे तब तक पहुँचा जा सकता हैfoo

क्या कोई बेहतर तरीका है?

मेरे अन्य विकल्प क्या हैं?

संपादित करें: स्पष्टता के लिए, मैं की भूमिका की व्याख्या करूंगा Handler RepJson। सर्वर किसी तरह जैसे आदेशों को स्वीकार करने की जरूरत है build stop report। क्लाइंट को इन कमांड्स के परिणामों को जानने का कोई तरीका चाहिए। मैंने JSON को उस माध्यम के रूप में चुना है जिसके साथ सर्वर और क्लाइंट एक दूसरे के साथ संवाद करते हैं। मैं केवल JSON / को प्रबंधित करने के लिए हैंडलर प्रकार का उपयोग कर रहा हूं और इससे अधिक कुछ नहीं।

जवाबों:


9

दार्शनिक रूप से कहें तो हास्केल / यसोद दुनिया में आप मूल्यों को आगे पीछे करना चाहते हैं, बजाय उन्हें पीछे की ओर लौटने के। इसलिए हैंडलर एक मूल्य वापस करने के बजाय, उन्हें इस प्रक्रिया में अगले चरण के लिए कॉल करें, जो एक अपवाद उत्पन्न करने के लिए हो सकता है।

याद रखें कि आप भविष्य के कार्यों की किसी भी राशि को एक ही वस्तु में बांध सकते हैं, इसलिए आप अपने हैंडलर और निरंतरता वाली वस्तु को पास कर सकते हैं, जो मूल रूप से उन्हें बताता है, "आपके द्वारा किए जाने के बाद, कोड के इस ब्लॉब को चलाएं।" इस तरह वे शून्य हो सकते हैं और कुछ भी नहीं लौटा सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.