我写了一个包含许多异步函数的库。 如果其中一个参数明显错误,则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 );
}
}
所以:
异步功能永远不会抛出是好习惯吗? (就像我一样)
现在,我正在捕捉所有错误。我应该更挑剔吗?也许组成一个错误类型,只是检查一下?如果是这样,在任何一种情况下我该怎么办?
答案 0 :(得分:2)
当然,异步函数永远不应抛出是一种好习惯吗? (就像我一样)
异步函数会在我们不喜欢的情况下抛出异常,仅仅是因为软件不完善。因此抛出自定义异常是完全正常的,但重要的是如何正确捕获它们。
问题在于,与同步代码不同,异步异常的堆栈可能不可用。因此,当异常发生时,并不总是可以说控件的返回位置和处理程序在哪里。 node.js有两种方法可以指定异步代码中发生异常时要执行的操作:process uncaughtException和domains。
如您所见,异步代码中的异常处理非常棘手,因此抛出异常应被视为最后一个选项。如果函数只返回操作的状态,则不是例外。
在我看来,在提供的代码片段中,异常被正确抛出,因为它表明该方法被不正确地调用而无法完成其工作。换句话说,错误是永久性的。这表明应该修复的应用程序存在严重缺陷。但是如果函数无法为某些临时原因创建参数而无需修改应用程序就可以修复,那么返回状态是比较合适的选择。
答案 1 :(得分:2)
您对异步代码的假设是正确的。请参阅Isaac Schlueter本人关于此主题的帖子:
节点中的模式是同步方法抛出,异步方法通过 错误作为回调的第一个参数。如果是第一个 回调的参数是falsey(通常为null或undefined),然后 一切都与世隔绝。
http://groups.google.com/forum/#!msg/nodejs/W9UVJCKcJ7Q/rzseRbourCUJ