兼顾将工作流中的某些步骤拿出来单独使用,一个工作流程中的错误处理该怎么做?

一个工作流程中的各个步骤的错误处理该怎么做?兼顾将其中一个步骤拿出来单独使用。

我现在要展示一个表格,步骤大致如下。

  1. 请求表头信息 (调用getFields()函数,返回一个promise。)
  2. 得到数据之后设置表头
    (上面两步可以按照下面的代码表示)

    function step1() {
     return getFields().then((data) => {
         ... setFields..    
     }).catch((error) => {
         ....
     })
    }
  3. 请求表中的数据(调用getTableData()函数,返回一个promise)
  4. 得到数据之后结合之前获取的字段信息设置表格中的数据
    (上面两步可以按照下面的代码表示)

    function step2() {
     return getTableData().then((data) => {
         ... setTableData..    
     }).catch((error) => {
         ....
     })
    }

    那么这两步怎么关联起来呢?

    async function process() {
     await step1();
     await step2();
    }

在这两步中的catch操作中我们还需要再throw new Error(...)将错误抛出吗?
如果不抛出来的话,如果step1中发生了错误,那么在process中怎么知道呢?

所以应该在catch中抛出,在process中添加try catch,并将错误处理统一到Process中?

async function process() {
  try {
    await step1();
    await step2();
  }catch {
        错误统一处理(将step1, step2中的一部分错误处理逻辑拿到这里来)
  }
}

现在表头信息有了,之后我们可能需要调用step2()来进行特定的查询来更新表单数据就可以了。

function query() {
    try {
        step2();
    }catch {
        ....
    }
}

如果我们不在step2中的catch中throw new Error的话,也就不需要写这里的try catch..了。

到底该怎么做呢?

阅读 694
1 个回答
class StepError extends Error {
  constructor(step, originalError) {
    super(`Error in ${step}: ${originalError.message}`);
    this.name = 'StepError';
    this.step = step;
    this.originalError = originalError;
  }
}

function step1() {
  return getFields()
    .then((data) => {
      setFields(data);
    })
    .catch((error) => {
      throw new StepError('step1', error);
    });
}

function step2() {
  return getTableData()
    .then((data) => {
      setTableData(data);
    })
    .catch((error) => {
      throw new StepError('step2', error);
    });
}

async function process() {
  try {
    await step1();
    await step2();
  } catch (error) {
    if (error instanceof StepError) {
      console.error(`${error.step} 失败:`, error.originalError);
      showErrorNotification(error.message);
    } else {
      console.error('未知错误:', error);
      showErrorNotification('发生未知错误');
    }
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏