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

IT技术 javascript error-handling promise es6-promise
2021-02-03 09:52:54

使用原生 (ES6) Promise我应该拒绝一个错误

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

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

Promise.reject('Something went wrong');

浏览器行为有何不同?

2个回答

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

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

我在手机上,所以这个答案很短,但我真的无法强调这有多重要。在大型(10K+ LoC)应用程序中,拒绝中的堆栈跟踪确实使轻松的远程错误搜索和在办公室度过漫长的夜晚有所不同。

谢谢 我也在开发大型应用程序很高兴有人对它有一些实践经验
2021-03-28 09:52:54
实话说?考虑 Bluebird,它具有更好的堆栈跟踪、类型化catch和未使用的拒绝跟踪,这些都是调试的杀手级功能。根据我们的经验,ES6 Promise到目前为止仅在 Firefox 中运行良好。
2021-04-12 09:52:54

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

理由

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

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

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