如何在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
相关产品推荐
相关产品推荐

