Node.js 在Node.Js中处理异常
示例
Node.js具有3种处理异常/错误的基本方法:
尝试-捕获块
错误是a的第一个参数callback
emit使用eventEmitter的错误事件
try-catch用于捕获从同步代码执行中引发的异常。如果呼叫者(或呼叫者的呼叫者,...)使用了try/catch,则他们可以捕获错误。如果没有一个调用者尝试捕获,则程序崩溃。
如果在异步操作上使用try-catch并且从异步方法的回调中引发了异常,则try-catch不会捕获该异常。要从异步操作回调中捕获异常,最好使用promises。
例子,以更好地理解它
//**示例-1**
function doSomeSynchronousOperation(req, res) {
if(req.body.username === ''){
throw new Error('User Name cannot be empty');
}
return true;
}
//调用上面的方法
try {
//同步码
doSomeSynchronousOperation(req, res)
catch(e) {
//这里处理异常
console.log(e.message);
}
//**示例-2**
function doSomeAsynchronousOperation(req, res, cb) {
//模仿异步操作
return setTimeout(function(){
cb(null, []);
},1000);
}
try {
//异步代码
doSomeAsynchronousOperation(req, res, function(err, rs){
throw new Error("async operation exception");
})
} catch(e) {
//异常不会在这里得到处理
console.log(e.message);
}
//异常未处理,因此将导致应用程序中断回调通常用于Node.js回调,因为回调异步传递事件。用户向您传递一个函数(回调),然后在异步操作完成后的某个时间调用它。
通常的模式是将回调作为a调用callback(err,result),其中err和result中只有一个为非null,取决于操作是成功还是失败。
function doSomeAsynchronousOperation(req, res, callback) {
setTimeout(function(){
return callback(new Error('User Name cannot be empty'));
}, 1000);
return true;
}
doSomeAsynchronousOperation(req, res, function(err, result) {
if (err) {
//这里处理异常
console.log(err.message);
}
//用有效数据做一些事情
});发出对于更复杂的情况,而是采用了回调,该函数本身可以返回EventEmitter对象,调用者预计将侦听发射器的错误事件。
const EventEmitter = require('events');
function doSomeAsynchronousOperation(req, res) {
let myEvent = new EventEmitter();
//异步运行
setTimeout(function(){
myEvent.emit('error', new Error('User Name cannot be empty'));
}, 1000);
return myEvent;
}
//调用功能
let event = doSomeAsynchronousOperation(req, res);
event.on('error', function(err) {
console.log(err);
});
event.on('done', function(result) {
console.log(result); //真正
});