48

使用原生 (ES6) Promise。我应该拒绝错误吗

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

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

Promise.reject('Something went wrong');

浏览器行为有什么区别?

4

2 回答 2

39

是的,它绝对应该。字符串不是错误,当您有错误时,通常意味着出现问题,这意味着您会真正享受良好的堆栈跟踪。没有错误 - 没有堆栈跟踪。

就像 try/catch 一样,如果你添加.catch到抛出的拒绝,你希望能够记录堆栈跟踪,抛出字符串会毁了你。

我在移动设备上,所以这个答案很短,但我真的无法强调它的重要性。在大型 (10K+ LoC) 应用程序中,拒绝中的堆栈跟踪确实在轻松的远程错误搜索和办公室的漫长夜晚之间产生了差异。

于 2014-09-24T15:30:03.917 回答
0

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

理由

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

如果某些代码失败,则异常返回Error对象。此外,如果你调用任何不支持 Promise 的外部库,它会Error在失败时抛出对象。如果 Promise 内部发生上述错误之一,它将被转换为catchwith Errorobject。

因此,如果您将使用stringas Promise 拒绝原因,您必须期望捕获可能发生在您的string(部分代码)或Error(发生一些一般错误时)。(err.message || err)因此,当您必须处理错误时,您将不得不在任何地方使用丑陋的代码。

于 2017-08-17T11:02:07.290 回答