处理应用错误 - Kotlin SDK
应用错误分为两大类:
当Atlas App Services请求在HTTP级别失败时,会出现服务错误。 这些错误会生成 ServiceException
Device Sync失败时会出现同步错误。 这些错误会生成SyncException 。 有关同步异常的更多信息,请参阅处理同步错误。
但是,有些错误是短暂的:发生这些错误的原因是客户端或 SDK 无法控制。 例如,由于网络错误而导致登录尝试失败。
其他错误需要逻辑修复。 例如,由于凭证不正确而导致登录尝试失败。
发生暂时错误时,应重试导致错误的操作。 如果重试时操作仍然失败,请调查逻辑修复。
服务错误
当 Atlas App Services 请求在 HTTP 级别失败(即 HTTP 请求返回,但 HTTP 状态代码不是200 (正常))时,会出现ServiceException 。
连接错误
当 SDK 和App Services后端之间的HTTP通信失败时,会发生ConnectionException 。 HTTP请求无法接收状态代码。
由于这些错误源自 SDK 控制之外的网络层,因此您应将这些错误视为暂时错误。 重试该操作,如果重试失败,请调查错误。 如果操作因客户端设备离线而失败,您可以要求应用用户在重新连接到互联网时重试操作。
错误请求错误
BadRequestException是由格式错误的App Services requests引发的。
当收到错误请求错误时:
检查操作的输入。
检查应用日志以获取有关Go的更多信息。
身份验证错误
当用户帐户操作(例如登录、注销或注册)失败时,会发生AuthException 。 通常,您会得到更具体的子类型,帮助您识别解决方案。
用户已确认的错误
当您尝试 确认 已确认的用户时,会出现 UserAlreadyConfirmedException 。
当收到用户已确认错误时,最好不要中断应用程序流程。 由于用户已确认,您可以安全地继续登录。 无需重试确认。
未找到用户错误
当App Services后端找不到具有所提供用户名的用户时,会发生UserNotFoundException 。 这通常是由电子邮件/密码用户名中的错别字引起的。
遇到此错误时,请提示用户重新输入用户名,然后重试。
用户已存在错误
当客户端尝试使用已在该应用程序中使用的用户名注册用户时,会发生UserAlreadyExistsException 。
遇到此错误时,请提示用户:
使用不同的用户名
如果已有帐户,请使用现有用户名登录
无效凭证错误
当JSON web token 、电子邮件/密码或API 密钥用户登录由于凭证无效而失败时,会发生 InvalidCredentialsException 。其他身份验证提供程序会抛出身份验证错误。
例子
您可以使用 Kotlin 的内置 runCatching 来处理SDK 中的错误 API。使用返回 结果 的onSuccess
和 回调onFailure
处理成功的 SDK API调用和错误情况。以下示例将匿名用户登录到应用程序中。如果登录尝试成功,我们将日志成功的身份验证尝试并将用户转换到另一个屏幕。如果登录尝试失败,我们将单独处理每个潜在的错误情况:
如果用户提供的凭证无效,我们会记录该尝试并显示一个弹出式 Toast,鼓励用户检查其凭证。
如果网络连接出现问题,我们会将问题记录到错误日志中,并显示一个弹出式 Toast,鼓励用户检查网络连接并重试。
对于所有其他错误,我们会将问题记录到错误日志中,并显示一个弹出式 Toast,通知用户登录尝试失败。
val app = App.create(YOUR_APP_ID) runCatching { app.login(Credentials.emailPassword(email, password)) }.onSuccess { Log.v("Successfully logged in") // transition to another activity, load a fragment, to display logged-in user information here }.onFailure { ex: Throwable -> when (ex) { is InvalidCredentialsException -> { Log.v("Failed to login due to invalid credentials: ${ex.message}") Toast.makeText(baseContext, "Invalid username or password. Please try again.", Toast.LENGTH_LONG).show() } is ConnectionException -> { Log.e("Failed to login due to a connection error: ${ex.message}") Toast.makeText(baseContext, "Login failed due to a connection error. Check your network connection and try again.", Toast.LENGTH_LONG).show() } else -> { Log.e("Failed to login: ${ex.message}") // generic error message for niche and unknown fail cases Toast.makeText(baseContext, "Login failed. Please try again.", Toast.LENGTH_LONG).show() } } }