You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理错误城市名引发的WeatherAPI查询错误

处理WeatherAPI错误代码1006的解决方案

当输入错误城市名称时,API会返回包含错误码1006的自定义错误响应,但现有代码无法正确解析并传递该错误信息。以下是针对性的修改方案:

1. 定义错误响应数据类

首先创建匹配API错误格式的数据类,让Gson能正确解析错误响应体:

data class ApiError(
    val code: Int,
    val message: String
)

data class ErrorResponse(
    val error: ApiError
)

2. 优化Repository的错误处理逻辑

修改repositoryApi中的CustomResponse方法,替换原有的简单异常抛出逻辑,解析API返回的自定义错误消息:

abstract class repositoryApi {
    suspend fun <T : Any> CustomResponse(work: () -> Response<T>): T {
        val response: Response<T> = work.invoke()
        if (response.isSuccessful) {
            return response.body()!!
        } else {
            // 尝试解析错误响应体
            val errorResponse = try {
                response.errorBody()?.string()?.let {
                    Gson().fromJson(it, ErrorResponse::class.java)
                }
            } catch (e: Exception) {
                null
            }
            // 优先使用API返回的错误描述,否则用默认提示
            val errorMsg = errorResponse?.error?.message ?: "请求失败,请稍后重试"
            throw Exception(errorMsg)
        }
    }
}

3. 完善协程的异常捕获范围

当前handelCoroutins.ThreadMain仅捕获IOException,无法处理Repository抛出的自定义异常,需要扩大捕获范围:

object handelCoroutins {
    fun <T:Any> ThreadMain(
        work: suspend (() -> T),
        callback: ((T) -> Unit),
        errorMessage: ((String) -> Unit)
    ) = CoroutineScope(Dispatchers.Main).launch {
        try {
            val data: T = CoroutineScope(Dispatchers.IO).async {
                work()
            }.await()
            callback(data)
        } catch (e: IOException) {
            errorMessage.invoke("网络连接异常,请检查网络")
        } catch (e: Exception) {
            // 传递Repository抛出的自定义错误消息
            errorMessage.invoke(e.message ?: "未知错误")
        }
    }
}

4. 优化ViewModel的协程管理

为避免内存泄漏,增加Job的生命周期管理,同时简化错误处理逻辑(协程内部已处理异常):

class viewModelapi: ViewModel() {
    val livedataErrorHandel = MutableLiveData<String>()
    var weather = MutableLiveData<Weatherapi>()
    private var job: Job? = null

    fun getHome(key: String, q: String, days: Int) {
        job?.cancel()
        job = handelCoroutins.ThreadMain(
            {
                handelRequst.Requst(Api.invoke().getCurrentTemp(key, q, days))
            },
            {
                weather.value = it
            },
            {
                livedataErrorHandel.value = it
            }
        )
    }

    override fun onCleared() {
        super.onCleared()
        job?.cancel()
    }
}

5. UI层展示错误信息

在MainActivity中新增错误LiveData的观察者,将错误消息展示给用户:

// 观察天气数据
viewmodel.weather.observe(requireActivity()) { weatherData ->
    textViewtemp.text = weatherData.current.temp_c.toString()
}

// 观察并展示错误信息
viewmodel.livedataErrorHandel.observe(requireActivity()) { errorMsg ->
    Toast.makeText(requireContext(), errorMsg, Toast.LENGTH_SHORT).show()
    // 也可以使用Snackbar或TextView展示错误
}

内容的提问来源于stack exchange,提问作者Omid Rikazadeh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 23:50:29