如何处理错误城市名引发的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
相关产品推荐
相关产品推荐

