问题的本质是从服务器读取API时,我得到3个参数“状态,错误,打印”,但碰巧服务器可能没有返回1个字段,例如,“状态,错误”和“ print" 丢失,或者响应中可能有错误,例如“status, error”,即响应中多出一个字符,应用程序崩溃,并且它在不输出日志的情况下静默崩溃,如何捕获错误并显示一条消息,使应用程序处于工作状态。
interface PrintApi {
@GET
suspend fun getPrintCommands(@Url url: String, @Query("bib") bib: Int?, @Query("card") card: String): PrintResponse
}
@Keep
@Serializable
data class PrintResponse(
val ok: Boolean? = false,
val error: String = readLine() ?: "", //test
val printout: List<PrintCmd>? = null
)
称呼:
private suspend fun getCommands(url: String, bib: Int?, tagNumber: String): List<PrintCmd>? {
try {
val result = api.getPrintCommands(url, bib, tagNumber) // приложение молча падает на этой строчке
if (result.ok == true && result.error.isBlank() && result.printout != null)
{
return result.print
}
else
{
return null
}
} catch (e: HttpException) {
Log.e("TEST", e.message())
Logger.w(e)
} catch (e: IOException) {
Log.e("TEST", e.toString())
Logger.w(e)
}
return null
}
这是工作 JSON 文件的样子:
{ "ok":true, "error":"ERROR_PRINT","printout" : [] }
损坏的 JSON 文件的响应如下所示:
{ "ok":true, "error":"ERROR_PRINT", }
设法得到一个错误
没有参数调用私有 ru.osport.osportnfc.model.api.PrintCmd() 失败
PrintCmd 类本身:
@Keep
@Serializable
sealed class PrintCmd()
继承
@Keep
@Serializable
@SerialName("normal_text")
data class PrintTextCmd(
val content: String,
val font_size: Int,
val align: String,
val bold: Boolean,
val italic: Boolean
) : PrintCmd()
应用程序静默下落,因为崩溃必须被捕获。
coroutineExceptionHandler
带有 tri-catch 的主题在这里不起作用。就算加了也不会掉改造有它
Response
,你可以把它包起来Responce<PrintResponse>
,然后用 KotlinResult
抓住它,抓住它就像result.run catching
Json
或其他什么,显示答案的样子,包括错误的答案。