Node.js 异步函数是否永远不会抛出?

Node.js 异步函数是否永远不会抛出?,node.js,asynchronous,error-handling,Node.js,Asynchronous,Error Handling,我编写了一个包含许多异步函数的库。 如果其中一个参数完全错误,同步辅助函数将抛出错误: proto.makeParameters= function( filters ){ default: throw( new Error("Field type unknown: " + fieldObject.type ) ); break; } 在我的异步函数中,当我使用它时,我有: proto.someAsyncFunction = function( cb ){ // Run

我编写了一个包含许多异步函数的库。 如果其中一个参数完全错误,同步辅助函数将抛出错误:

proto.makeParameters= function( filters ){
  default:
    throw( new Error("Field type unknown: " + fieldObject.type ) );
  break;
}
在我的异步函数中,当我使用它时,我有:

proto.someAsyncFunction = function( cb ){

  // Run the query
  try {
    var parameters = this.makeParameters( filters );
  } catch( e ){
   return cb( e );
  }
}
因此:

  • asyncfunctions永远不应该抛出是一种好的实践吗?(和我一样)

  • 现在,我正在捕捉所有错误。我应该更挑剔一点吗?也许可以编一个错误类型,然后检查一下?如果是,在这两种情况下我都应该怎么做

异步函数永远不应该抛出错误,这是一个好的实践吗?(和我一样)

当然,异步函数会在我们不喜欢的时候抛出异常,这仅仅是因为软件的缺陷。所以抛出自定义异常是完全可以的,但重要的是如何正确捕获它们

问题在于,与同步代码不同,异步异常的堆栈可能不可用。因此,当异常发生时,并不总是能够说出在哪里返回控件以及处理程序在哪里。node.js有两种方法可以指定在异步代码中发生异常时要执行的操作:和

正如您所看到的,异步代码中异常的处理非常棘手,所以抛出异常应该被视为最后一个选项。如果函数只是返回操作的状态,则它不是异常


在我看来,在提供的代码片段中,异常被正确地抛出,因为它表明该方法被不正确地调用,无法完成其工作。换句话说,错误是永久性的。这表明应用程序中存在严重缺陷,应予以修复。但是,如果函数由于某些临时原因无法创建参数,而这些临时原因可以在不修改应用程序的情况下修复,那么返回状态是更合适的选择

您对异步代码的假设是正确的。请参阅Isaac Schlueter本人关于该主题的帖子:

节点中的模式是同步方法抛出,异步方法传递 将错误作为回调的第一个参数。如果第一个 回调函数的参数为false(通常为null或未定义),则 天下无难事


对于node,您所做的是正确的习惯用法。节点回调的第一个参数应该是错误消息或未定义(或者是null?)。您对异步代码的假设是正确的。请看@HectorCorrea,并将此作为答案添加,这是最好的答案,我们愿意接受。