source

Yesod의 예외

factcode 2023. 4. 4. 22:28
반응형

Yesod의 예외

나는 데몬을 만들었는데 그것은 매우 원시적인 형태를 사용했다.ipc(특정 워드가 지정된 순서대로 있는 문자열을 telnet하여 전송합니다).갑자기 정신을 차리고 지금 사용하고 있습니다.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 개체입니다.

하고 싶다foos 도우미 함수는 다음 명령을 반환할 수 있습니다.Either하지만 어떻게 해야 할지 모르겠어 게다가 내 행동 목록의 평가를 종료할 수도 있고buildSeq.

내가 볼 수 있는 유일한 선택은

1) 확인exceptionHandler는 핸들러에 있습니다.놓다JobMap에서App기록.사용.getYesod적절한 값을 변경하다JobMap예외에 대한 세부 정보를 나타내며, 다음에 액세스 할 수 있습니다.foo

더 좋은 방법이 있을까요?

다른 선택사항은 무엇입니까?

편집: 알기 쉽게 하기 위해 다음 항목에 대해 설명하겠습니다.Handler RepJson서버는 다음과 같은 명령어를 받아들일 수 있는 방법이 필요합니다.build stop report클라이언트는 이러한 명령어의 결과를 알 수 있는 방법이 필요합니다.서버와 클라이언트가 서로 통신하는 매체로 JSON을 선택했습니다.JSON 입력/출력을 관리하기 위해서만 핸들러 타입을 사용하고 있습니다.

철학적으로 말하자면, Haskell/Yesod 세계에서는 가치관을 거꾸로 되돌리는 것이 아니라 앞으로 전달하기를 원합니다.따라서 핸들러가 값을 반환하는 대신 프로세스의 다음 단계로 콜 전송하도록 합니다.이것은 예외를 생성하는 경우가 있습니다.

향후의 액션을 1개의 오브젝트에 번들 할 수 있기 때문에, 「이 코드 블록을 실행해 주세요」라고 하는 계속 오브젝트를 핸들러나 foo에 건네줄 수 있습니다.그렇게 하면 그들은 무효가 되고 아무것도 돌려주지 않을 수 있다.

언급URL : https://stackoverflow.com/questions/10133448/exceptions-in-yesod

반응형