首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >忽略TypeScript中catch子句中的某些错误类型

忽略TypeScript中catch子句中的某些错误类型
EN

Stack Overflow用户
提问于 2021-10-14 10:43:16
回答 1查看 474关注 0票数 0

我使用Axios将HTTP请求发送到REST端点,并希望将任何可能的错误封装在可以传递给父函数的自定义错误中,在父函数中将其记录如下:

  • 如果在Axios调用中有错误,我将在同一方法中捕获它,并将其包装在我的自定义错误类型中,以添加关于发生在何处的有意义的描述。
  • 如果HTTP请求成功,但返回的状态代码或数据有问题,则我将抛出一个自定义错误,该错误也应传递给父函数

因此,基本上,我要做的是只捕获本地MyCustomError 类型的而不是的错误。

根据这个答案的说法,在TypeScript中的尝试捕获块中没有选择错误类型的方法。这就给我留下了这个构造:

代码语言:javascript
复制
try {
  response = await axios.delete(deleteRequestURL, deleteRequestConfig);
  if (isRequestResponseSuccessful(response)) {
    return Promise.resolve(response.data);
  } else {
    throw new MyCustomError(`The DELETE request failed for some reason.`);
  }
} catch (e) {
  if (e instanceof MyCustomError) {
    throw e;
  } else {
    throw new MyCustomError(`Error while trying to reach the REST endpoint: ${e}`);
  }
}

IntelliJ警告我,这是理所当然的。

有没有一种更优雅的方法来做到这一点,而不去捕捉错误,只会再次抛出错误呢?

显然,我可以将自定义错误封装在另一个自定义错误对象中,并将错误消息连接起来,但这也不是很优雅。

EN

回答 1

Stack Overflow用户

发布于 2021-10-14 14:29:11

谢谢你的问题。

你对这件事感到有点不安是很对的。有大量的信息可以解释为什么不应该在类型记录上下文中抛出错误,因为抛出错误并不是类型安全。正如这篇文章所解释的那样,TS编译器不够聪明,无法知道throw是在catch块中抛出的。

您可以使用的一种模式是调用Axios返回一个对象,如下所示:

代码语言:javascript
复制
type Result<T> = { status: 'Success' | 'Failure'; value: T | Error; }

然后,不要从您的Axios调用中抛出,而是返回一个错误sttached的失败响应(以防您想在其他地方处理它)。更方便地,上面的文章更详细地介绍了Axios;还请注意,这种模式是由阿波罗GraphQL使用的,这不是巧合。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69569295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档