Promise.reject消息应该包含在Error中吗?

时间:2014-09-24 15:16:14

标签: javascript error-handling promise es6-promise

使用原生(ES6)Promise。我应该拒绝Error

Promise.reject(new Error('Something went wrong'));

或者我应该用字符串拒绝:

Promise.reject('Something went wrong');

浏览器行为有什么不同?

2 个答案:

答案 0 :(得分:22)

是的,绝对应该。 A string is not an error,当你有错误时,通常会出现问题,这意味着你真的很喜欢堆栈跟踪。没有错误 - 没有堆栈跟踪。

就像使用try / catch一样,如果将.catch添加到抛出拒绝中,您希望能够记录堆栈跟踪,为您抛出字符串废墟。

我在移动设备上,所以这个答案很短,但我真的无法强调这是多么重要。在大型(10K + LoC)应用程序中,拒绝堆栈中的痕迹确实使得轻松的远程错误捕获与办公室中漫长的夜晚之间存在差异。

答案 1 :(得分:0)

我建议仅使用Error对象(不是字符串)来发送原因。

理由

代码的其他部分在Promise拒绝原因中生成Errors ...

如果某些代码失败,则异常将返回Error对象。此外,如果您将调用任何不支持Promise的外部库,它将在出现故障时抛出Error对象。 如果上面提到的错误之一发生在Promise中,它将被转换为带有catch对象的Error

因此,如果您使用string作为承诺拒绝原因,则必须预期可以使用string(代码的一部分)或Error(当某些代码时)发生一般错误)。因此,当您必须处理错误时,您将不得不在任何地方使用丑陋的代码(err.message || err)