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

