¿Cómo manejar los errores correctamente cuando se utiliza el cliente HTTP en Kotlin?

Tengo el siguiente código, que entra en contacto con un sistema externo (Capsule CRM) usando Apache HTTP Client.

override fun findPartiesByUrlFragment(urlFragment: String): PartiesSearchResult { val req = HttpGet("https://api.capsulecrm.com/api/v2/parties/search?q=${urlFragment}") req.setHeader("Authorization", "Bearer ${ApiToken}") req.setHeader("Accept", "application/json"); val httpClient = HttpClients.createDefault() val res = httpClient.execute(req) val parser = Parser() val json:JsonObject = parser.parse(res.entity.content) as JsonObject [...] // What happens thereafter isn't relevant because most errors are likely to occur in the code above return PartiesSearchResult(false, "", emptyList()) } 

Este fragment de código debe funcionar en una aplicación que funciona 24 horas al día, 7 días a la semana, por lo tanto, necesito hacer un correcto procesamiento de errores y asegurarme de que la aplicación completa no falle, si ocurre un problema esperado (por ejemplo, el server de Capsule está inactivo). false en PartiesSearchResult(false, "", emptyList()) significa que la operación falló.

Puedo chequear el código de respuesta HTTP y analizar la respuesta solamente, si es 200.

Pero estoy confundido porque no veo ninguna exception declarada aquí (a diferencia de Java).

Ahora quiero hacer esto:

 override fun findPartiesByUrlFragment(urlFragment: String): PartiesSearchResult { var httpClient = null var res = null try { val req = HttpGet("https://api.capsulecrm.com/api/v2/parties/search?q=${urlFragment}") req.setHeader("Authorization", "Bearer ${ApiToken}") req.setHeader("Accept", "application/json"); httpClient = HttpClients.createDefault() res = httpClient.execute(req) if (res == null) { return PartiesSearchResult(false, "null response", emptyList()) } if (res.entity == null) { return PartiesSearchResult(false, "null entity", emptyList()) } val content = res.entity.content if (content == null) { return PartiesSearchResult(false, "null content", emptyList()) } if (responseCode(res) == 200) { val parser = Parser() val json:JsonObject = parser.parse(content) as JsonObject [...] // Convert JSON to my own objects return PartiesSearchResult(true, "", emptyList()) } return PartiesSearchResult(false, "Invalid HTTP response code", emptyList()) } catch (Throwable t) { return PartiesSearchResult(false, toString(t), emptyList()) } finally { closeIfNotNull(res) closeIfNotNull(httpClient) } return PartiesSearchResult(false, "", emptyList()) } 

¿Existe una mejor manera de manejar errores en Kotlin (para la tarea particular de recuperar datos de otro sistema que utiliza el cliente HTTP), si mi sistema no debe fallar debido a situaciones problemáticas esperadas (server externo caído, server extraño sobrecargado o con errores internos) , pérdida temporal de connection a Internet, etc.)?

Tienes múltiples opciones para un mejor mantenimiento de este método. Estas opciones no son necesariamente específicas de Kotlin. Más como refactorización y layout de objects . El más obvio sería dividirlo en múltiples methods. Como su método maneja múltiples preocupaciones diferentes, puede dividirlo en piezas más específicas. Luego testing a background, a testing de errores y registra su comportamiento.

Por ejemplo:

  • La primera parte maneja la request HTTP GET. Extraiga esto a un método que devuelve la respuesta GET y verifique las excepciones de connection .
  • La parte central se puede extraer como una validation de la respuesta GET para asegurarse de que tiene datos válidos para trabajar.
  • La última parte es nuevamente una preocupación separada de analizar JSON de la respuesta GET. Lugar para manejar las excepciones del analizador.
  • Obtener una URL en Android Kotlin de forma asíncrona
  • Kotlin: ¿Por qué el más / less unario no puede inferir el tipo genérico de la asignación?
  • Anko: scope interno de aplicar, resolución de propiedad confusa
  • Spring FacebookTemplate plantea una exception de permiso para el perfil del usuario
  • Cómo include HtmlUnit en un proyecto de Kotlin
  • Clase de Json a Kotlin Data
  • ¿Puedo usar Kotlin con Codename One?
  • Visibilidad del constructor restringida al file
  • ¿Cómo puedo saber si mi aplicación de inicio Spring está en modo de debugging?
  • El código de Vertx Sync se ejecuta varias veces
  • Micro web-framework para Kotlin