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

Firebase signInWithEmailAndPassword的try/catch与监听器语法整合方法

Firebase邮箱/密码登录:正确添加try/catch的方式

首先明确:Firebase Auth的signInWithEmailAndPassword是异步方法,异步操作的错误会通过addOnFailureListener回调处理,但如果传递的参数不符合要求(比如空邮箱/密码),方法会同步抛出IllegalArgumentException,这部分异常需要用try/catch捕获,否则会导致崩溃。

你只需要把signInWithEmailAndPassword的调用部分包裹在try/catch块中,完全不会影响原有Success/Failure监听器的逻辑,修改后的代码如下:

fun loginWithFirebase(email: String, password: String) {
    setInProgress(true)
    try {
        FirebaseAuth.getInstance().signInWithEmailAndPassword(email, password)
            .addOnSuccessListener {
                UiUtil.showToast(this, "Logged in successfully")
                setInProgress(false)
                startActivity(Intent(this, MainActivity::class.java))
                finish()
            }
            .addOnFailureListener {
                UiUtil.showToast(applicationContext, it.localizedMessage ?: "Login failed, something went wrong")
                setInProgress(false)
            }
    } catch (e: IllegalArgumentException) {
        // 处理参数错误,比如邮箱/密码为空、格式非法的情况
        UiUtil.showToast(applicationContext, e.localizedMessage ?: "Invalid email or password format")
        setInProgress(false)
    } catch (e: Exception) {
        // 捕获其他可能的同步异常
        UiUtil.showToast(applicationContext, "Login failed: ${e.localizedMessage}")
        setInProgress(false)
    }
}

关键说明:

  • 同步抛出的异常(参数空值、格式错误等)会被try/catch捕获,直接在这里处理,不会进入异步的FailureListener。
  • 异步操作中的错误(邮箱不存在、密码错误、网络问题等)仍然会通过addOnFailureListener处理,完全保留你原有的逻辑。
  • 不要在catch块中区分具体错误类型(比如单独判断"用户不存在"或"密码错误"),这会绕过Firebase的反用户枚举保护,你的做法是正确的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 08:24:52