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

Android Firebase Storage无网络时无法捕获异常问题求助

无网络时Firebase Storage请求未触发catch块的解决办法

核心原因及对应方案

  • Firebase默认重试机制延迟了异常抛出:putFile返回的UploadTask在无网络时会自动重试一段时间,不会立刻触发失败,所以await()不会马上进入catch块。可以直接禁用重试或者缩短重试时长:
    viewModelScope.launch(Dispatchers.IO) {
        try {
            // 禁用上传重试
            FirebaseStorage.getInstance().maxUploadRetryTimeMillis = 0
            FirebaseStorage.getInstance().reference.child("storage")
                .putFile(Uri.fromFile(File("new_file")))
                .await()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    
  • 协程作用域的异常拦截:如果viewModelScope有自定义异常处理器,可能会拦截异常导致catch块不执行。用supervisorScope包裹代码,确保异常能被当前catch捕获:
    viewModelScope.launch(Dispatchers.IO) {
        supervisorScope {
            try {
                FirebaseStorage.getInstance().reference.child("storage")
                    .putFile(Uri.fromFile(File("new_file")))
                    .await()
            } catch (e: Exception) {
                e.printStackTrace()
            }
        }
    }
    
  • 优先捕获具体异常类型:直接捕获StorageException(Firebase存储专属异常),再兜底捕获通用Exception,避免遗漏特定异常:
    viewModelScope.launch(Dispatchers.IO) {
        try {
            FirebaseStorage.getInstance().reference.child("storage")
                .putFile(Uri.fromFile(File("new_file")))
                .await()
        } catch (e: StorageException) {
            // 处理Firebase存储相关异常,比如错误码判断
            e.printStackTrace()
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    
  • 前置检查文件有效性:确认File("new_file")路径正确、文件存在,避免因文件问题导致的异常干扰无网络场景的排查。

补充验证方案

搭配addOnFailureListener监听失败事件,和await()的catch块形成互补,确保异常被捕获到:

viewModelScope.launch(Dispatchers.IO) {
    val uploadTask = FirebaseStorage.getInstance().reference.child("storage")
        .putFile(Uri.fromFile(File("new_file")))
    // 额外监听失败事件
    uploadTask.addOnFailureListener { e ->
        e.printStackTrace()
    }
    try {
        uploadTask.await()
    } catch (e: Exception) {
        e.printStackTrace()
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:22:34