NodeJs中的异常处理

NodeJs中的异常处理是一个应该注意的点。

try/catch

通常我们在代码中捕获异常,会用下面的方式:

1
2
3
4
5
try {
//process
} catch (e) {
errorHandler(e)
}

但是在Nodejs中,这种方式对于处理异步编程并不一定适用,例如:

1
2
3
4
5
6
7
8
function asyncFunc (callback) {
process.nextTick(callback);
}
try {
asyncFunc(callback);
} catch (e) {
errorHandler(e)
}

上面的代码中,调用asyncFunc(callback)callback在下一个事件循环才会执行,但是try/catch只能捕获当前事件循环内的异常,
所以当callback执行时抛出的异常将无法捕获。

不要对回调函数进行异常捕获

如下下面的写法:

1
2
3
4
5
6
try {
process();
callback(null, result);
} catch (e) {
callback(e, result);
}

上面的代码中,不仅会捕获process()中的异常,callback()中的异常一样会捕获,所以如果callback()执行抛出异常,catch()代码块一样会捕获,
这样的话callback()将会执行两次,正确的写法应该是:

1
2
3
4
5
6
7
try {
process();
} catch (e) {
return callback(e, result);
}
callback(null, result);

处理异常的常规写法

通常回调函数的第一个参数是异常,如果第一个参数为空,则表示没有异常。