【问题标题】:How come my catch block is not executing?为什么我的 catch 块没有执行?
【发布时间】:2021-06-18 15:19:24
【问题描述】:

为什么登录出错时我的catch块没有被执行?这是我的事件处理程序:

const handleLogin = async (e) => {
    e.preventDefault();

    try {
      await login(dispatch, loginUser);
    } catch (err) {
      console.log(err);
      setSnackbarOpen(true);
      setErrorMessage(err.response.data.message);
    }
  };

这是我的登录操作:

export const login = async (dispatch, payload) => {
  try {
    dispatch({
      type: "USER_REQUEST",
    });

    const res = await axios.post("/api/users/auth/signin", payload);

    dispatch({
      type: "SET_USER",
      payload: {
        user: {
          email: res.data.email,
          name: res.data.name,
        },
      },
    });
  } catch (err) {
    console.log("CAUGHT ERROR IN login()");
    dispatch({
      type: "SET_ERROR",
      payload: { error: err.response.data.message },
    });
    return err;
  }
};

我记录了“登录 () 中的 CAUGHT ERROR”,但未执行我的 handleLogin 捕获块中的代码。

【问题讨论】:

  • 您的login() 函数永远不会拒绝它返回的承诺,因此await login() 永远不会转到catchlogin() 函数有时会执行 return err,但这只是返回的值,而不是被拒绝的承诺。如果您希望拒绝 login() 返回的承诺,那么您必须在 catch() 块中的 login() 中使用 throw err 而不是 return err
  • 哇,谢谢!这是非常好的信息,它解决了我的问题

标签: async-await promise try-catch


【解决方案1】:

您的login() 函数永远不会拒绝它返回的承诺,因此await login() 永远不会抓住。 login() 函数有时会执行 return err,但这只是返回的值,而不是被拒绝的承诺。如果您希望拒绝 login() 返回的承诺,那么您必须在 catch() 块中的 login() 中使用 throw err 而不是 return err

  } catch (err) {
    console.log("CAUGHT ERROR IN login()");
    dispatch({
      type: "SET_ERROR",
      payload: { error: err.response.data.message },
    });
    throw err;     // <== this changed to throw instead of return
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 2016-07-16
    • 2015-08-31
    相关资源
    最近更新 更多