FirebaseAuthException 抛出,尽管它被捕获

时间:2021-02-13 15:58:16

标签: android firebase kotlin exception

我正在尝试构建一个 firebase 登录功能,但即使捕获了抛出的异常,代码也会崩溃。

当我将异常作为日志输出时,代码可以工作,但是当我将其作为异常传递时,它会崩溃。

我想将异常传递给 MainActivity 以便在那里正确处理它,即在那里将 exception.message 作为 toast 输出。

只有当 firebase 报告崩溃异常时,登录过程才能使用有效的登录数据而不会出现问题。

internal var loginResult = MutableLiveData<LoginResult>()
inner class LoginResult {
        var authResult: AuthResult? = null
        var exception: Exception? = null
        var isSuccessful = false

        constructor(authResult: AuthResult?, isSuccessful: Boolean) {
            this.authResult = authResult
            this.isSuccessful = isSuccessful
        }
        
        constructor(authResult: AuthResult?, exception: Exception?, isSuccessful: Boolean) {
            this.authResult = authResult
            this.exception = exception
            this.isSuccessful = isSuccessful
        }
    }

fun login(context: Context, email: String, password: String) {
        FirebaseAuth.getInstance().signInWithEmailAndPassword(email, password)
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    loginResult.value = LoginResult(task.result, task.isSuccessful)
                    startSession(context, LoginType.CREDENTIAL)
                    saveCredentialsEncrypted(context, email, password)
                } else {
                    try {
                        loginResult.value = LoginResult(task.result, task.exception, task.isSuccessful)
                    } catch (e: FirebaseAuthInvalidCredentialsException) {
                        loginResult.value = LoginResult(task.result, e, task.isSuccessful)
                    } catch (e: Exception) {
                        loginResult.value = LoginResult(task.result, e, task.isSuccessful)
                    }

                }
            }
    }
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.simplesaakotlin, PID: 23984
    com.google.android.gms.tasks.RuntimeExecutionException: com.google.firebase.auth.FirebaseAuthInvalidCredentialsException: The password is invalid or the user does not have a password.
        at com.google.android.gms.tasks.zzu.getResult(com.google.android.gms:play-services-tasks@@17.1.0:15)
        at com.example.simplesaakotlin.auth.AuthManager$login$1.onComplete(AuthManager.kt:84)
        at com.google.android.gms.tasks.zzj.run(com.google.android.gms:play-services-tasks@@17.1.0:4)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at com.google.android.gms.internal.tasks.zzb.dispatchMessage(com.google.android.gms:play-services-tasks@@17.1.0:6)
        at android.os.Looper.loop(Looper.java:223)
        at android.app.ActivityThread.main(ActivityThread.java:7660)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
     Caused by: com.google.firebase.auth.FirebaseAuthInvalidCredentialsException: The password is invalid or the user does not have a password.
        at com.google.android.gms.internal.firebase-auth-api.zztt.zza(com.google.firebase:firebase-auth@@20.0.2:28)
        at com.google.android.gms.internal.firebase-auth-api.zzvb.zza(com.google.firebase:firebase-auth@@20.0.2:9)
        at com.google.android.gms.internal.firebase-auth-api.zzvc.zzk(com.google.firebase:firebase-auth@@20.0.2:1)
        at com.google.android.gms.internal.firebase-auth-api.zzuz.zzh(com.google.firebase:firebase-auth@@20.0.2:25)
        at com.google.android.gms.internal.firebase-auth-api.zztq.zzk(com.google.firebase:firebase-auth@@20.0.2:1)
        at com.google.android.gms.internal.firebase-auth-api.zzoi.zza(com.google.firebase:firebase-auth@@20.0.2:2)
        at com.google.android.gms.internal.firebase-auth-api.zzvg.zza(com.google.firebase:firebase-auth@@20.0.2:25)
        at com.google.android.gms.internal.firebase-auth-api.zzuq.zzf(com.google.firebase:firebase-auth@@20.0.2:4)
        at com.google.android.gms.internal.firebase-auth-api.zzpy.zzj(com.google.firebase:firebase-auth@@20.0.2:5)
        at com.google.android.gms.internal.firebase-auth-api.zztu.zzi(com.google.firebase:firebase-auth@@20.0.2:8)
        at com.google.android.gms.internal.firebase-auth-api.zzsk.zzd(Unknown Source:15)
        at com.google.android.gms.internal.firebase-auth-api.zzsj.accept(Unknown Source:6)
        at com.google.android.gms.common.api.internal.zach.doExecute(com.google.android.gms:play-services-base@@17.3.0:2)
        at com.google.android.gms.common.api.internal.zah.zaa(com.google.android.gms:play-services-base@@17.3.0:9)
        at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zac(com.google.android.gms:play-services-base@@17.3.0:192)
        at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zab(com.google.android.gms:play-services-base@@17.3.0:157)
        at com.google.android.gms.common.api.internal.GoogleApiManager$zaa.zaa(com.google.android.gms:play-services-base@@17.3.0:125)
        at com.google.android.gms.common.api.internal.GoogleApiManager.handleMessage(com.google.android.gms:play-services-base@@17.3.0:144)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at com.google.android.gms.internal.base.zap.dispatchMessage(com.google.android.gms:play-services-base@@17.3.0:8)
        at android.os.Looper.loop(Looper.java:223)
        at android.os.HandlerThread.run(HandlerThread.java:67)

更新: 抛出错误是因为我尝试访问 task.result,但没有结果,请参阅 try catch 块。

为了解决这个错误,我传递了 null 作为 authResult

 fun login(context: Context, email: String, password: String) {
        FirebaseAuth.getInstance().signInWithEmailAndPassword(email, password)
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    loginResult.value = LoginResult(task.result, task.isSuccessful)
                    startSession(context, LoginType.CREDENTIAL)
                    saveCredentialsEncrypted(context, email, password)
                } else {
                    loginResult.value = LoginResult(null, task.exception, task.isSuccessful)
                }
            }
    }

0 个答案:

没有答案
相关问题