5

我编写了一个包含许多异步函数的库。如果参数之一明显错误,则 SYNCHRONOUS 辅助函数会引发错误:

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 );
  }
}

所以:

  • 异步函数永远不应该抛出是一种好习惯吗?(就像我一样)

  • 现在,我正在捕捉所有错误。我应该更挑剔吗?也许弥补一个错误类型并检查它?如果是这样,在这两种情况下我该怎么办?

4

2 回答 2

2

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

node 中的模式是同步方法抛出,异步方法将错误作为第一个参数传递给回调。如果回调的第一个参数是错误的(通常为 null 或未定义),那么一切都很好。

http://groups.google.com/forum/#!msg/nodejs/W9UVJCKcJ7Q/rzseRbourCUJ

于 2013-11-14T00:37:33.190 回答
2

异步函数永远不应该抛出是一种好习惯吗?(就像我一样)

当然,只要我们不喜欢异步函数,它就会抛出异常,这仅仅是因为软件不完善。所以抛出自定义异常完全没问题,但重要的是如何正确捕获它们。

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

如您所见,处理异步代码中的异常很棘手,因此应将抛出异常视为最后的选择。如果函数只返回操作的状态,它也不例外。

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

于 2013-11-13T14:05:00.167 回答