首页 > 解决方案 > 处理 AWS Amplify onError 回调异常

问题描述

我无法理解如何处理 Android Java 中 Amplify 函数的 onError 回调。例如,下面是一个用于注册用户的 Amplify 调用。该函数工作得很好,并且做了它应该做的事情,但是,我无法弄清楚如何处理可以用这个函数抛出的不同类型的 onError 回调,特别是因为它是用 Lambda 函数格式化的。

例如,如果用户已经注册,“错误”回调将变成“用户名ExistsException”,但我不知道如何过滤该异常并处理它。最终,我希望能够处理这个特定的异常以生成一个 AlertDialog,在这个例子中告诉用户“这个帐户已经存在”。

还有很多其他类似的功能,它们的结构与我想处理其他类型的错误的方式相同。

非常感谢任何帮助。有关如何使用这些函数的参考,请在此处查看 Amplify 文档和教程。

已解决更新 21 年 1月 23 日:我使用@Jameson的回答在下面发布了一个答案

Amplify.Auth.signUp(
            user_email,
            user_password,
            AuthSignUpOptions.builder().userAttributes(attributes).build(),
            result -> {
                Log.i("AuthQuickStart", "Result: " + result.toString());
                Intent intent = new Intent(SignUpActivity.this, SignUpAuthActivity.class);
                Bundle bun = new Bundle();
                bun.putSerializable("user", user);
                intent.putExtras(bun);
                startActivity(intent);
                finish();
            },

            error -> {
                //in the example, the Error becomes the UsernameExistsException callback
                Log.e("AuthQuickStart", "Sign up failed", error); 
            }
    );

标签: javaandroidamazon-web-servicesaws-amplify

解决方案


正如您所注意到的,Amplify Android 的大多数方法都是异步的,并在两个回调之一中发出结果或错误。回调接口是“简单的功能接口”,因此可以使用 lambda 表达式语法进行简化。

在 Java 中,您可以查找如下UsernameExistsException错误:

AuthSignUpOptions options =
    AuthSignUpOptions.builder()
        .userAttributes(attributes)
        .build();
Amplify.Auth.signUp(username, password, options,
    result -> { /* handle result ... */ },
    error -> {
        if (error instanceof UsernameExistsException) {
            showAlreadyExistsDialog();
        }
    }
);

和:

private void showAlreadyExistsDialog() {
    new AlertDialog.Builder(context)
        .setTitle("User already exists!")
        .setMessage("Tried to sign-up an already-existing user.")
        .setPositiveButton(android.R.string.yes, (dialog, which) -> {
            // on click...
        })
        .setNegativeButton(android.R.string.no, null)
        .setIcon(android.R.drawable.ic_dialog_alert)
        .show();
}

与 Kotlin 类似,但您可以使用以下when构造:

val options = AuthSignUpOptions.builder()
    .userAttributes(attributes)
    .build()
Amplify.Auth.signUp(username, password, options,
    { /* result handling ... */ },
    { error ->
        when (error) {
            is UsernameExistsException -> 
                showAlreadyExistsDialog()
        }
    }
)

推荐阅读