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

JobMapTMVar Map현재 작업에 대한 정보를 추적 하는 입니다.

이제 제가 가지고있는 것은 핸들러입니다.

foo :: Handler RepJson

foo 내 데몬에 대한 명령을 나타내며 각 핸들러는 다른 JSON 객체를 처리해야 할 수 있습니다.

내가하고 싶은 것은 JSON성공을 나타내는 하나의 객체와 일부 예외에 대한 정보를 강조하는 다른 JSON 객체를 보내는 것 입니다.

내가 좋아하는 것 foo의 도우미 함수는를 반환 할 수있는 Either,하지만 난 그 얻을 플러스 행동의 내 목록의 평가를 종료 할 수 방법을 모르겠어요 buildSeq.

여기에 내가 보는 유일한 선택

1) exceptionHandler핸들러에 있는지 확인하십시오 . 넣어 JobMapApp기록. 사용 getYesod에 적절한 값 변경 JobMap후 액세스 할 수있는 예외에 대한 세부 사항을 표시를,foo

더 좋은 방법이 있습니까?

다른 선택은 무엇입니까?

편집 : 명확성을 위해의 역할을 설명하겠습니다 Handler RepJson. 서버는 build stop report. 클라이언트는 이러한 명령의 결과를 알 수있는 방법이 필요합니다. 서버와 클라이언트가 서로 통신하는 매체로 JSON을 선택했습니다. JSON 입출력을 관리하기 위해 핸들러 유형을 사용하고 있습니다.

답변:


9

철학적으로 말하면 Haskell / Yesod 세계에서는 값을 뒤로 반환하지 않고 앞으로 전달하려고합니다. 따라서 핸들러가 값을 반환하도록하는 대신 프로세스의 다음 단계로 전달하여 예외를 생성하도록합니다.

미래의 모든 작업을 단일 객체로 묶을 수 있으므로 기본적으로 "완료 한 후이 코드 blob을 실행"이라고 알려주는 연속 객체를 핸들러 및 foos에 전달할 수 있습니다. 그렇게하면 그들은 무효가되고 아무것도 반환하지 않을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.