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); //真正 });