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

如何在Kotlin中统一捕获Cognito身份提供商异常?

如何用单个catch块捕获所有AWS Cognito相关异常?

问题背景

使用AWS SDK(非Amplify)配置Cognito时,try/catch中无法通过通用Exception高效捕获所有AWS特定异常,希望通过单个catch块统一处理所有Cognito相关异常。

原代码示例:

AuthenticationScreenState.REGISTER_VALIDATION -> {
  try {
    // confirm account request
    confirmSignUp()

    setScreenVisibility(false)
    delay(300)

    screenStateTo(AuthenticationScreenState.VALIDATION_COMPLETE)

  }catch(e: UsernameExistsException){
    setAuthenticationErrorMessage(e.message)
  }
  catch(e: NotAuthorizedException){
    setAuthenticationErrorMessage(e.message)
  }
  catch(e: ExpiredCodeException){
    setAuthenticationErrorMessage(e.message)
  }
  catch(e: Exception){
    Log.d("Exception", e.message.toString())
    setAuthenticationErrorMessage(e.message)
  }
}

查看Cognito SDK异常模型后发现,UsernameExistsException、ExpiredCodeException等异常均继承自CognitoIdentityProviderException,但直接添加该父类的catch块却无法捕获子类异常。


解决方案

1. 确保正确导入父类异常

AWS Kotlin SDK中CognitoIdentityProviderException位于aws.sdk.kotlin.services.cognitoidentityprovider.model包下,必须在代码顶部正确导入:

import aws.sdk.kotlin.services.cognitoidentityprovider.model.CognitoIdentityProviderException

2. 调整catch块顺序(关键)

Kotlin的catch块按顺序匹配,若要统一捕获所有Cognito异常,直接移除所有子类异常的catch块,只保留父类异常的catch块,且必须放在兜底Exception块之前。

修改后的统一捕获代码:

AuthenticationScreenState.REGISTER_VALIDATION -> {
  try {
    // confirm account request
    confirmSignUp()

    setScreenVisibility(false)
    delay(300)

    screenStateTo(AuthenticationScreenState.VALIDATION_COMPLETE)

  } catch(e: CognitoIdentityProviderException) {
    Log.d("CognitoProviderException", e.message ?: "未知Cognito异常")
    setAuthenticationErrorMessage(e.message)
  } catch(e: Exception) {
    Log.d("Exception", e.message.toString())
    setAuthenticationErrorMessage(e.message)
  }
}

3. 特殊场景:针对特定异常做自定义处理

如果需要对某几个子类异常做特殊逻辑,可保留对应的catch块,但必须放在CognitoIdentityProviderException块之前:

AuthenticationScreenState.REGISTER_VALIDATION -> {
  try {
    // confirm account request
    confirmSignUp()

    setScreenVisibility(false)
    delay(300)

    screenStateTo(AuthenticationScreenState.VALIDATION_COMPLETE)

  } catch(e: UsernameExistsException) {
    // 针对用户名已存在的自定义提示
    setAuthenticationErrorMessage("该用户名已被注册,请更换")
  } catch(e: CognitoIdentityProviderException) {
    // 统一处理其他所有Cognito异常
    Log.d("CognitoProviderException", e.message ?: "未知Cognito异常")
    setAuthenticationErrorMessage(e.message)
  } catch(e: Exception) {
    // 兜底处理非Cognito类异常
    Log.d("Exception", e.message.toString())
    setAuthenticationErrorMessage(e.message)
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 05:22:07