首页 > 解决方案 > 如何使用 async/await 构建 try/catch?

问题描述

我有以下代码,简化以省略不必要的代码:

try {
  const response = await axios.put(url, {});
  if ( response.status === 200 ) {
    MicroService.action(data);
  }
} catch ( error ) {
  // user is not signed in, so send to create-account/sign-in
  if (error.status === 401) {
    MicroService.otherAction(data);
  } else {
    console.error(`The server returned an unexpected ${error.status} error upon attempting to hit ${url}`);
  }
}

问题是该catch子句还捕获了第四行中发生的任何错误,MicroService.action(data). 我只想通过第 2 行的 axios 调用捕获错误,不应消除其他错误。

但是如果我把MicroService.action(data)它移到 之后catch,即使try失败也会发生,这是错误的。只有在try成功的情况下才会发生。

我可以在try子句中设置一个变量,例如if (response.status === 200) let success = true;,然后在catch子句之后检查该变量。但除了最简单的情况外,这对任何事情都感觉混乱和不雅。

有没有更好的方法来做到这一点?

标签: javascriptecmascript-6async-await

解决方案


通过覆盖回调避免令人烦恼的异常。validateStatus如果401状态码是预期结果,则将其视为一个结果,并允许其他意外状态码正常抛出:

const response = await axios.put(url, {}, {
  validateStatus (status) {
    return [200, 401].includes(status);
  }
});

switch (response.status) {
case 200:
  MicroService.action(data);
  break;
case 401:
  MicroService.otherAction(data);
  break;
}

如果您不希望任何状态代码引发错误,请在语句中添加一个default案例:switch

const response = await axios.put(url, {}, {
  validateStatus () {
    return true;
  }
});

switch (response.status) {
case 200:
  MicroService.action(data);
  break;
case 401:
  MicroService.otherAction(data);
  break;
default:
  console.error(`The server returned an unexpected ${response.status} error upon attempting to hit ${url}`);
  break;
}

推荐阅读