当前位置: 首页 > 知识库问答 >
问题:

如何在Kotlin中的公共类中处理不同函数的catch异常?

阮梓
2023-03-14

这是我的 RemoteDataSource 类,我将在其中编写许多 api 调用,如下所示:

suspend fun getReviewData1() = getResult {
        try {
           apiService.getReviewData(getCustomerId())
        } catch (e: Exception) {
           handleException(e)
        }
    }

suspend fun getReviewData2() = getResult {
        try {
           apiService.getReviewData(getCustomerId())
        } catch (e: Exception) {
           handleException(e)
        }
    }

现在,您可以看到,为了每一个乐趣,我需要将代码包装在try/catch块中。一切都很好,我也能捕捉到异常,但为什么要为每个函数编写这么多try/catch?相反,我需要在一个公共类中执行,这样我就可以像这样简单地调用我的函数。

suspend fun getReviewData() = getResult {
     apiService.getReviewData(getCustomerId())
 }

如果您想更改任何内容,您可以写一个答案并建议我,for ex in getResault()

另一个基类中的getResult():

protected suspend fun <T> getResult(call: suspend () -> Response<T>?): Resource<T> {
        try {
            val response = call()
            if (response?.isSuccessful == true) {
                val body = response.body()
                if (body != null) return Resource.success(body, response.message(), response.code())
            }
            return error((response?.message() ?: context.getString(R.string.unable_to_reach_server)),
                (response?.code() ?: AppConstants.INetworkValues.DEFAULT_ERROR_CODE))
        } catch (e: Exception) {
            return error(e.message ?: e.toString(), (call()?.code() ?: AppConstants.INetworkValues.DEFAULT_ERROR_CODE))
        }
    }

    private fun <T> error(message: String, code: Int): Resource<T> {
        LogUtils.d(message)
        return Resource.error(null, message, code)
    }

处理异常()

fun handleException(e: Exception): Response<Any> {
        if (e is NoConnectivityException) {
            return Response.error(AppConstants.INetworkValues.INTERNET_ERROR_CODE, getDummyResponseBody())
        } else {
            return Response.error(AppConstants.INetworkValues.DEFAULT_ERROR_CODE, getDummyResponseBody())
        }
    }

我试过这个答案,但没有成功:https://stackoverflow.com/a/46517243/14016240

请帮忙。

共有1个答案

訾旭
2023-03-14

getResult函数在catch块中出错。如果对call()的第一次调用引发异常,则您将再次调用call(。我认为再次调用它没有意义,因为它可能会再次抛出,您将无法返回Resource.error

如果您解决了这个问题,您将不需要在您的其他函数中使用try/的捕捉,因为调用将安全地包装在try/的捕捉,并将任何错误打包到Resource.error

要解决这个问题:因为您已经处理了<code>响应?。code</code>在try块中,没有理由重复获取<code>call()?。catch块中的code。您可以将其简化为

return error(e.message ?: e.toString(), AppConstants.INetworkValues.DEFAULT_ERROR_CODE)
 类似资料:
  • 问题内容: 大家好,我被困在一个地方,问题是我有下面显示的三个类,并且我想在AsyncTask类中实例化我的DatabaseHelper类。您能否提供帮助,如何在AsyncTask类中获取上下文? 问题解决了 MainActivity类 数据库助手 FetchData类 # 感谢Kasra,我创建了第四个类并在调用AsyncTask之前在MainActivity中使用它 ContextStatic

  • 无法使用由try和catch块包围的@controlleradvice和@afterthollow when方法。 我可以一步一步解释 }

  • 问题内容: 我已经在javaworld.com上阅读了两篇文章(1)(2),有关所有类字段应如何为私有,并且getter / setter方法同样糟糕。对象应该对它拥有的数据进行操作,而不是允许对其进行访问。 我目前正在为Connect Four 进行大学作业。在设计程序时,玩游戏的特工需要访问董事会的状态(以便他们可以决定移动的方向)。他们还需要将此举动传递给游戏,以便可以将其确认为合法举动。在

  • 让我们假设我在科特林有一门课,如下所示 此外,让我们定义一个内插函数生成电子邮件域,它基于给定域的名称生成电子邮件地址 现在,正如有人说Kotlin是100%可与Java互操作的,我如何在Java类中使用这个中缀函数? 上面使用infix可能不合适,但我想知道如何在Java中使用。 如果我的理解有误,请纠正。

  • 我使用的是改型2.0.1。我想处理所有类型的网络错误和异常(如没有网络连接,超时错误,服务器找不到等)我已经找到这个链接。但是其中一些方法在V1.8.0中被否决了。在2.0.1中如何做到这一点?

  • 问题内容: 在Java中的各个类之间共享数据的最佳方法是什么?我有一堆变量,它们由不同的类以不同的方式在不同的文件中使用。让我尝试说明问题的简化版本: 这是我之前的代码: 现在看起来像这样: 所以无论如何,我应该每次都传递x和y(其中x,y是存储在辅助类func中的变量)吗? 我的想法是要有一个特殊的容器类,其中存放x和y。顶级类将具有容器类的实例,并使用set方法更改x,y。 我的帮助程序类还将