¿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.
  • Función de extensión Kotlin en propiedad mutable
  • Kotlin, Mockito y Android Test Instrumentation. La propiedad de Lateinit no se ha inicializado
  • Kotlin JS Anulación de la function 'externa' con error de parameters opcionales
  • ¿Podría explicarnos la divertida requestByZipCode?
  • UnsupportedOperationException al crear un proyecto de Kotlin en Idea
  • Cómo establecer el valor de propiedad pnetworkingeterminado de Kotlin a `this`
  • Kotlin: cuándo y cómo se deben usar las expresiones Lambda
  • El operador de Kotlin Reflection obtiene la implementación
  • ¿Puedo agregar operadores a las classs existentes?
  • ¿Cómo get los nombres de los parameters a través de la reflexión en kotlin?
  • AccessToken.getCurrentAccessToken () siempre devuelve null en Kotlin