【问题标题】:does promise catch too much errors?承诺会捕获太多错误吗?
【发布时间】:2014-12-17 10:02:32
【问题描述】:

我在doc:
Q.fcall(promisedStep1) .then(promisedStep2) .then(promisedStep3) .then(promisedStep4) .then(function (value4) { // Do something with value4 }) .catch(function (error) { // Handle any error from all above steps }) .done();

中按照这种风格写承诺

catch 子句将捕获任何错误,包括拼写错误。 不过根据nodejs dos:

由于 throw 在 JavaScript 中的工作原理,几乎没有任何方法可以安全地“从上次中断的地方继续”,而不会泄漏引用或创建其他类型的未定义脆弱状态。响应抛出的错误最安全的方法是关闭进程。

如果我们以回调样式编写代码,而不是以承诺样式编写代码,则会抛出某些类型的错误
这真的让我很困惑。写promise时如何避免泄露引用。

谢谢~

【问题讨论】:

  • 如果您有需要清理的打开文件句柄之类的东西,那么您必须在打开文件句柄范围内的某处有一个.catch(),以便在出现异常时清理它们抛出。这只是你作为程序员的责任。在 nodejs 中,文件句柄不会自行清理。与套接字等其他一些资源相同。
  • 在链中的每个范围内,您都必须问自己一个问题——如果这里抛出异常,是否需要清理一些东西。如果答案是肯定的,那么您必须在那里捕获异常。清理后可以重新抛出异常。

标签: javascript node.js error-handling promise


【解决方案1】:

该示例展示了良好的承诺链,包括使用.done() 确保任何未处理的异常都从承诺链抛出到外部应用程序。 至于引用和错误处理:promise 链只保证一个错误将被转发到.catch 回调。如果在抛出错误时无法清理状态 - 你就不走运了。例如

Q.fncall(function firstStep() {
  var fs = open file reference
  foo.bar; // generates ReferenceError
}).then(function somethingElse() {
  ...
}).catch(function (err) {
  // we have caught ReferenceError
  // but we cannot clean up open fs reference!
}).done();

我们发现了错误,但 catch 处理程序无法关闭 fs 引用。这就是意味着即使有了 Promise,我们也必须考虑如何在发生错误时清理资源。

【讨论】:

  • 很好的例子。但是我们应该如何处理呢?重新抛出它让进程死掉?
  • @bpceee 如果您希望节点具有合理的性能,您绝对应该处理您的错误。否则,您将处于一个非常有问题的位置,因为 Node 服务器中的启动时间非常慢。
  • @BenjaminGruenbaum 你是对的,但是如果我们发现一个意外错误怎么办。说它是从第三方库中抛出的,它可能会引入泄漏。我认为在这种情况下,我们应该让进程终止。这是您在使用回调样式编程时无需考虑的一件事。
  • 当然你会考虑它,你会遇到与回调完全相同的问题。在出现任何错误时关闭服务器是不合理的行为。
猜你喜欢
  • 2022-10-20
  • 1970-01-01
  • 2022-12-19
  • 2021-03-03
  • 2021-11-28
  • 2018-05-12
  • 2019-08-20
  • 1970-01-01
  • 2022-09-24
相关资源
最近更新 更多