【问题标题】:Catching errors from one function inside another JavaScript React从另一个 JavaScript React 中的一个函数捕获错误
【发布时间】:2021-09-25 09:53:11
【问题描述】:

我有两个功能,登录(在fileB.js中):

export const login = async (data) => {
  try {
    const response = await auth.login(data);
    return response;
  } catch (e) {
    return new Error(e);
  }
};

和 loginProcess(在 fileA.js 中):

const loginProcess = (data) => {
    login(data)
      .then((response) => {
        if (response.status === 200) {

        }
      })
      .catch((e) => {
        setError(true);
      });
  };

如果我在 login() 函数内有错误,它会返回 new Error(e) 但在 loginProcess() 内,来自 login() 的错误不会被 catch 捕获,而是 then。我需要从login() 中的catch 中的loginProcess() 中捕获new Error,我该如何解决?

【问题讨论】:

  • "它返回新的 Error(e)" - 这是错误的。一个不应该return 错误,一个应该throw 他们作为例外。
  • 另外,将错误包装在另一个 Error 中是不合逻辑的 - 为什么你甚至在函数内部甚至 catch 这个错误?

标签: javascript reactjs try-catch


【解决方案1】:

您正在通过返回一个错误对象将承诺拒绝转换为承诺履行。

catch 块重新调整非承诺值将实现login 函数返回的承诺与catch 块的返回值。

拒绝login 函数返回的承诺:

  • 重新抛出catch块捕获的错误,或者

  • login 函数中删除try-catch 块,让调用代码处理错误。

login 函数可以重写为:

export const login = (data) => {
    return auth.login(data);
};

我建议你选择第二个选项并重写login函数如上所示。不需要 catch 块来重新抛出错误。

【讨论】:

  • 我刚刚将return 更改为throw,现在可以使用了,谢谢!
  • 我建议写return await auth.login(data) 这样login 函数就不会从堆栈跟踪中删除,并且它不会设置重构陷阱,以防有人在某个时候添加回try/catch将来(例如捕获特定错误)或尝试将响应分配给变量而不是直接返回它,或附加诸如|| somethingElse之类的东西。 (见this issue。)
  • @CherryDT 恕我直言,login 函数根本不需要是 asynclogin 函数可以只返回承诺,调用代码可以进行必要的错误处理。
  • 这会掩盖它是一个异步操作的事实,它的调用者很可能应该是awaited,因为现在该类型甚至不再是AsyncFunction。是的,从技术上讲,你说的是正确的,我只是认为它可能会在以后导致错误。
猜你喜欢
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 2012-10-28
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-12
相关资源
最近更新 更多