gpt4 book ai didi

javascript - 处理 Bluebird 中的异常

转载 作者:行者123 更新时间:2023-11-29 21:27:21 24 4
gpt4 key购买 nike

function ApiError(response) {
this.message = 'API error';
this.response = response;
}

ApiError.prototype = Object.create(Error.prototype);
ApiError.prototype.constructor = ApiError;
ApiError.prototype.name = 'ApiError';

export default ApiError;

我有这个自定义异常,我在某个时候抛出它,但是当我试图像 promise 一样捕获它时

import ApiError from './ApiError';
...
.catch(ApiError, (e) => {
console.log('api error');
})
.catch((e) => {
console.log(e); <= this is undefined(in ApiError)
});

错误被委托(delegate)给通用 catch,错误说消息不能分配给未定义(ApiError 中的 this=undefined),我在这里做错了什么?

编辑:问题实际上是我没有返回 Bluebird promise 的实例,而是返回 Node Promise(使用 fetch),我通过包装 fetch 解决了它在 Bluebird Promise.resolve 中。

最佳答案

这个错误听起来像是您没有正确创建 ApiError 对象的实例。

当你抛出一个错误时,它应该是:

throw new ApiError(xxx);

注意,必须使用new。你的错误的细节让它看起来像你没有使用 new


或者,您可以更改 ApiError 构造函数的实现,以便您可以这样做;

throw ApiError(xxx);

但是,您必须更改 ApiError 以检测它是否使用 new 调用,如果不是,则调用 new 本身。

function ApiError(response) {
if (!(this instanceof ApiError)) {
return new ApiError(response);
}
this.message = 'API error';
this.response = response;
}

或者,在 ES6 中,您可以使用 new.target 选项:

function ApiError(response) {
if (!new.target) {
return new ApiError(response);
}
this.message = 'API error';
this.response = response;
}

关于javascript - 处理 Bluebird 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37207033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com