我使用Axios将HTTP请求发送到REST端点,并希望将任何可能的错误封装在可以传递给父函数的自定义错误中,在父函数中将其记录如下:
因此,基本上,我要做的是只捕获本地MyCustomError 类型的而不是的错误。
根据这个答案的说法,在TypeScript中的尝试捕获块中没有选择错误类型的方法。这就给我留下了这个构造:
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警告我,这是理所当然的。
有没有一种更优雅的方法来做到这一点,而不去捕捉错误,只会再次抛出错误呢?
显然,我可以将自定义错误封装在另一个自定义错误对象中,并将错误消息连接起来,但这也不是很优雅。
发布于 2021-10-14 14:29:11
谢谢你的问题。
你对这件事感到有点不安是很对的。有大量的信息可以解释为什么不应该在类型记录上下文中抛出错误,因为抛出错误并不是类型安全。正如这篇文章所解释的那样,TS编译器不够聪明,无法知道throw是在catch块中抛出的。
您可以使用的一种模式是调用Axios返回一个对象,如下所示:
type Result<T> = { status: 'Success' | 'Failure'; value: T | Error; }然后,不要从您的Axios调用中抛出,而是返回一个错误sttached的失败响应(以防您想在其他地方处理它)。更方便地,上面的文章更详细地介绍了Axios;还请注意,这种模式是由阿波罗GraphQL使用的,这不是巧合。
https://stackoverflow.com/questions/69569295
复制相似问题