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