本文假设:
* 你已经熟悉了JavaScript、Java、 Python、 C++ 或者类似的语言中异常的概念,而且你知道抛出异常和捕获异常是什么意思。
* 你熟悉怎么用NodeJS编写代码。你使用异步操作的时候会很自在,并能用`callback(err,result)`模式去完成异步操作。你得知道下面的代码不能正确处理异常的原因是什么[脚注1]
~~~
function myApiFunc(callback)
{
/*
* This pattern does NOT work!
*/
try {
doSomeAsynchronousOperation(function (err) {
if (err)
throw (err);
/* continue as normal */
});
} catch (ex) {
callback(ex);
}
}
~~~
你还要熟悉三种传递错误的方式: - 作为异常抛出。 - 把错误传给一个callback,这个函数正是为了处理异常和处理异步操作返回结果的。 - 在EventEmitter上触发一个Error事件。
接下来我们会详细讨论这几种方式。这篇文章不假设你知道任何关于domains的知识。
最后,你应该知道在JavaScript里,错误和异常是有区别的。错误是Error的一个实例。错误被创建并且直接传递给另一个函数或者被抛出。如果一个错误被抛出了那么它就变成了一个异常[脚注2]。举个例子:
~~~
throw new Error('something bad happened');
~~~
但是使用一个错误而不抛出也是可以的
~~~
callback(new Error('something bad happened'));
~~~
这种用法更常见,因为在NodeJS里,大部分的错误都是异步的。实际上,`try/catch`唯一常用的是在`JSON.parse`和类似验证用户输入的地方。接下来我们会看到,其实很少要捕获一个异步函数里的异常。这一点和Java,C++,以及其它严重依赖异常的语言很不一样。