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

Error handling 在Kotlin中使用HTTP客户端时如何正确处理错误?,error-handling,kotlin,apache-httpclient-4.x,Error Handling,Kotlin,Apache Httpclient 4.x,我有以下代码,它使用ApacheHTTP客户端与外部系统(CapsuleCRM)联系 override fun findPartiesByUrlFragment(urlFragment: String): PartiesSearchResult { val req = HttpGet("https://api.capsulecrm.com/api/v2/parties/search?q=${urlFragment}") req.setHeader("Authorization"

我有以下代码,它使用ApacheHTTP客户端与外部系统(CapsuleCRM)联系

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())
}
这段代码必须在一个全天候运行的应用程序中工作,因此我需要进行正确的错误处理,并确保在出现预期问题(例如Capsule的服务器关闭)时整个应用程序不会崩溃
false
partieseSearchResult(false,“,emptyList())
中表示操作失败

我可以检查HTTP响应代码并仅解析响应(如果是200)

但我很困惑,因为我在这里没有看到任何声明的异常(与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())
}

如果我的系统不能因为预期的问题情况(外部服务器关闭、外部服务器过载或出现内部错误、暂时失去internet连接等)而失败,是否有更好的方法在Kotlin中进行错误处理(用于使用HTTP客户端从另一个系统获取数据的特定任务)?

为了更好地维护此方法,您有多种选择。这些选项不一定是特定于Kotlin的。更像是和。最明显的一种方法是将其拆分为多个方法。因为您的方法处理多个不同的关注点,所以您可以将其拆分为更集中的部分。然后彻底测试防错记录他们的行为

例如:

  • 第一部分处理HTTPGET请求。将其提取到返回GET response的方法中,并检查是否存在错误
  • 中间部分可以被提取出来作为GET响应的验证,以确保您得到了一个有效的数据来处理
  • 最后一部分再次关注解析JSON和GET响应。处理解析器异常的位置