asynctask에서 서버와 통신할 때 예외처리 질문입니다.

조회수 1944회

async비동기 통신을 통해서 서버에서 JSON형식으로 파싱을 해오고 있습니다. 그런데 간혹 서버가 점검중이거나 서버에 문제가 있으면 1초정도있다가 바로 오류가 뜨면서 강제종료가 됩니다. 서버에 문제가 있을 때 강제종료가 아니라 서버문제라고 다이얼로그나 다른 방식으로 띄우거나 알려주고 싶은데 어떤 방식으로 해야하나요? async background에서 setconnecttimeout을 해야하나요? 만약 타임아웃을 10초라고 걸어놓으면 10초가 지난이후에는 어디다가 코딩을 해야 할지 모르겠습니다. post에서 하나요?

  • 다른 얘기일 수 있지만 async task 는 재사용을 할 수 없어서, thread + handler 를 사용해서 구현하면 실패시 몇초 후 다시 실행 같은 로직을 구현하기에 더 편합니다. 알 수 없는 사용자 2016.11.16 11:19

1 답변

  • 가장 좋은 방법은 서버에서 점검 중이라는 약속된 상태 코드를 내려주고, 클라이언트에서 해당 코드를 받았을 때 다이얼로그를 띄우는 처리를 하는 것입니다.

    그리고 서버에서 에러 발생 시 강제종료된다.라는 얘기는 예외(Exception)가 발생하기 때문인데요. 에러가 발생할 때 해당 예외를 try-catch로 처리해보세요. 혹은 HTTP 상태코드로 에러가 확인 가능한지도 확인해보시고요.

    예를 들면 Github API는 다음과 같이 HTTP 상태코드로 에러를 내려주고, Response body로 에러 내용을 보여줍니다. 서버 API가 아래와 같이 정의되어 있다면 클라이언트에서는 상태코드가 에러로 분류되면 message에 담긴 내용을 팝업으로 보여주는 처리를 하면 됩니다.

    HTTP/1.1 422 Unprocessable Entity
    Content-Length: 149
    
    {
      "message": "Validation Failed",
      "errors": [
        {
          "resource": "Issue",
          "field": "title",
          "code": "missing_field"
        }
      ]
    }
    

    정리하면 서버 응답에서 에러로 인지할 수 있는 정보가 있는지 확인해보시고, 그에 따라서 에러 상황을 UI에 적절히 표현해주면 될 것 같습니다. 말씀하신 타임아웃으로 처리하는 것은 우회적이고, 완전한 에러처리가 어려워보여 추천하고 싶지는 않습니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 서버응답에서 에러로 인지할 수 있는 정보가 없는 것 같은데 자체적으로 http상태를 통해 예외처리를 하려고 하는데, 서버가 점검중일 때 어떤 상태인지 확인하려면 직접 서버를 닫아봐야하나요? 제가 코딩을 하면서 이런저런 것들을 해보면서 확인을 해보려고 하는데 방법이 있나요? kyudongPark 2016.11.3 13:25
    • 서버 코드를 직접 다룰 수 있다면 점검 상태일 때, 에러 코드를 내려주면 됩니다만 말씀하신 걸로 봐서는 서버 점검 중 상태에 대해서 이해가 조금 다른 것 같습니다. 일단은 서버를 해당 상태로 만들어두고 직접 확인해보는게 좋겠네요. 알 수 없는 사용자 2016.11.3 14:18

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)