Node.js 在Node.Js中处理异常

示例

Node.js具有3种处理异常/错误的基本方法:

  1. 尝试-捕获

  2. 错误是a的第一个参数callback

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