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

为何try-catch块无法捕获writeData抛出的Firebase写入错误?

问题根源

你的writeData函数虽然声明了async,但内部调用Firebase的set方法后,没有返回这个异步操作的Promise。这就导致外层await拿到的是一个默认resolve的空Promise,而set抛出的错误属于独立的未关联Promise,根本传不到外层的try-catch里,所以控制台会出现“Uncaught (in promise) Error”,但setFormError根本不会执行。

两种修复方案

方案1:用async/await简化逻辑(推荐)

把writeData里的.then/.catch换成try-catch,直接等待set操作完成,确保错误能正确传递:

import { getDatabase, ref, set } from 'firebase/database';
import { v4 as uuidv4 } from 'uuid';

const writeData = async (table, data, id) => {
  const db = getDatabase();
  const itemPath = id ? `${table}/${id}` : `${table}/${uuidv4()}`;
  try {
    const result = await set(ref(db, itemPath), { ...data });
    return result;
  } catch (error) {
    console.error(error);
    throw error; // 重新抛出错误,让外层try-catch捕获
  }
};

export { writeData };

方案2:返回Promise链

如果习惯用.then/.catch写法,只要确保把set的整个Promise链返回给调用者就行:

import { getDatabase, ref, set } from 'firebase/database';
import { v4 as uuidv4 } from 'uuid';

const writeData = (table, data, id) => {
  const db = getDatabase();
  const itemPath = id ? `${table}/${id}` : `${table}/${uuidv4()}`;
  // 关键:返回这个Promise链
  return set(ref(db, itemPath), { ...data })
    .then((r) => r)
    .catch((error) => {
      console.error(error);
      throw error; // 重新抛出,让外层捕获
    });
};

export { writeData };
修复效果

修改后,外层onSubmit里的try-catch就能正常捕获到writeData的错误,执行setFormError(true)的逻辑,同时控制台不会再出现未捕获的Promise错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 16:20:29