fs = require('fs');
try {
fs.stat('doesnt_exist.txt', function(err, stats) {
if (err) {
throw err;
}
console.log('data', stats);
});
}
catch (e) {
console.error('error statting');
}
这里的错误不会被捕捉。
解决方案
process.on('uncaughtException', function(err) {
console.error(err.stack);
});
因为 Node.js 传递很多回调和有很多高阶函数,所以你要博阿正你的程序能在别的地方被调用的时候不会出问题,尽量不要用跟上下文相关的 this 和 new
// 一个回调嵌套回调的例子
function convertJsonToCsv(filename, target, callback) {
readFile(filename, function (err, content) {
if (err) {
return callback(err);
}
parseJson(content, function (err, data) {
if (err) {
return callback(err);
}
convertToCsv(data, function (err, csv) {
if (err) {
return callback(err);
}
writeFile(target, csv, callback);
});
});
});
}
// 切分成小块之后
function convertJsonToCsv(filename, target, callback) {
readJsonFile(filename, function (err, data) {
if (err) { return callback(err); }
writeCsvFile(target, data, callback);
});
}
function readJsonFile(filename, callback) {
readFile(filename, function (err, content) {
if (err)
{ return callback(err); }
parseJson(content, callback);
});
}
function writeCsvFile(target, data, callback) {
convertToCsv(data, function (err, csv) {
if (err) { return callback(err); }
writeFile(target, csv, callback);
});
}
var CACHE = {};
function getRecord(id, callback) {
if (CACHE[id])
{ return CACHE[id]; }
http.get('http://foo/' + id, callback);
}
//别人在用这段代码的时候容易忘记CACHE变量
function getMyRecord(user, callback)
{ getRecord('record-' + user.id, callback); }
//Wrong code:
function writeCsvFile(target, data, callback) {
convertToCsv(data, function (err, csv)
{ writeFile(target, csv, callback); }
);
}
//Right code:
function writeCsvFile(target, data, callback) {
convertToCsv(data, function (err, csv) {
if (err)
{ return callback(err); }
writeFile(target, csv, callback);
});
}
if (err)
{ callback(err); }