Ausnahmen in Jessod

93

Ich hatte einen Daemon erstellt, der eine sehr primitive Form von ipc(Telnet und Senden eines Strings mit bestimmten Wörtern in einer bestimmten Reihenfolge) verwendete. Ich habe es herausgeschnappt und verwende es jetzt JSON, um Nachrichten an einen YesodServer weiterzuleiten . Es gab jedoch einige Dinge, die mir an meinem Design sehr gut gefallen haben, und ich bin mir nicht sicher, wie ich mich jetzt entscheide.

Folgendes habe ich getan:

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

Jede Funktion in buildSeq sah so aus

foo :: Stage -> ReaderT Config IO ()

data Config = MkConfig (Either JobID Product) BaseDir JobMap

JobMapist eine TMVar Map, die Informationen über aktuelle Jobs verfolgt.

Was ich jetzt habe, sind Handler, die alle so aussehen

foo :: Handler RepJson

foo stellt einen Befehl für meinen Daemon dar. Jeder Handler muss möglicherweise ein anderes JSON-Objekt verarbeiten.

Ich möchte ein JSONObjekt senden , das den Erfolg darstellt, und ein anderes JSON-Objekt, das Informationen über eine Ausnahme unterdrückt.

Ich möchte foo, dass die Hilfsfunktion eine zurückgeben Eitherkann, bin mir aber nicht sicher, wie ich das bekomme, sowie die Möglichkeit, die Auswertung meiner Aktionsliste zu beenden buildSeq.

Hier ist die einzige Wahl, die ich sehe

1) Stellen Sie sicher, dass exceptionHandlersich in Handler befindet. Tragen Sie JobMapdie AppAufzeichnung ein. Mit getYesoddem entsprechenden Wert ändert in JobMapangibt , Einzelheiten über die Ausnahme, die durchgeführt wird , kann dann zugegriffenfoo

Gibt es einen besseren Weg?

Was sind meine anderen Möglichkeiten?

Bearbeiten: Aus Gründen der Klarheit werde ich die Rolle von erklären Handler RepJson. Der Server benötigt eine Möglichkeit, Befehle wie zu akzeptieren build stop report. Der Client muss die Ergebnisse dieser Befehle kennen. Ich habe JSON als Medium ausgewählt, mit dem Server und Client miteinander kommunizieren. Ich verwende den Handler-Typ nur, um den JSON-Ein- / Ausgang zu verwalten, und nicht mehr.

Michael Litchard
quelle

Antworten:

9

Philosophisch gesehen möchten Sie in der Haskell / Yesod-Welt die Werte weitergeben, anstatt sie rückwärts zurückzugeben. Anstatt die Handler einen Wert zurückgeben zu lassen, lassen Sie sie zum nächsten Schritt im Prozess weiterleiten, der möglicherweise darin besteht, eine Ausnahme zu generieren.

Denken Sie daran, dass Sie eine beliebige Anzahl zukünftiger Aktionen in einem einzelnen Objekt bündeln können, sodass Sie Ihren Handlern und Foos ein Fortsetzungsobjekt übergeben können, das ihnen im Grunde sagt: "Wenn Sie fertig sind, führen Sie diesen Code-Blob aus." Auf diese Weise können sie nichtig sein und nichts zurückgeben.

Tyler Durden
quelle