在Kotlin中使用HTTP客户端时如何正确处理错误?

我有以下代码,它使用Apache HTTP客户端与外部系统(Capsule CRM)联系。

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()) } 

这段代码必须在运行24/7的应用程序中工作,因此我需要做正确的错误处理,并确保整个应用程序不会崩溃,如果预期的问题(例如胶囊服务器停机)发生。 在PartiesSearchResult(false, "", emptyList())PartiesSearchResult(false, "", emptyList())表示操作失败。

如果是200,我可以截取HTTP响应代码并仅解析响应。

但我很困惑,因为我没有在这里看到任何声明的异常(而不是Java)。

现在我想要这样做:

 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()) } 

有没有更好的方法来做Kotlin中的错误处理(对于从另一个系统使用HTTP客户端获取数据的特定任务),如果我的系统由于预期的问题情况而不能失败(外部服务器关闭,外部服务器过载或者有内部错误,网络连接暂时丢失等)?

您有多个选项可以更好地维护此方法。 这些选项不一定是Kotlin特有的。 更像重构和对象设计 。 最明显的一个就是把它分成多种方法。 由于您的方法可以处理多种不同的问题,因此您可以将其分解为更加集中的部分 然后彻底测试防错记录他们的行为。

例如:

  • 第一部分处理HTTP GET请求。 解压缩到一个返回GET响应的方法并检查连接异常 。
  • 中间部分可以被提取作为GET响应的验证,以确保你有一个有效的数据工作。
  • 最后一部分是解析来自GET响应的JSON的另一个关注点。 处理解析器异常的地方。