为啥 catch 块不会触发并且应用程序停止在 node.js 中工作

Posted

技术标签:

【中文标题】为啥 catch 块不会触发并且应用程序停止在 node.js 中工作【英文标题】:Why catch block doesn't fire and application stop working in node.js为什么 catch 块不会触发并且应用程序停止在 node.js 中工作 【发布时间】:2015-12-23 06:19:53 【问题描述】:

我有以下代码:-

try             
        user.findOne( Email: req.body.email , function (e, d) 
            if (d) 
                res.json(
                    'success': false,
                    'json': null,
                    'message': 'This email already exists!',
                    'status': 200
                );
             else 
                var u = new user();
                u.Email = req.body.email;
                u.Password = req.body.password;
                u.Name = req.body.name;
                user.save(function (e, d) 
                    res.json(d);
                );
            
        );
     catch (ex) 
        console.log(ex.message + " \n" + ex.stack);
        res.json(
            'success': false,
            'json': ex,
            'message': 'Opps! something wen wrong please try again later!',
            'status': 500
        );
    

我在user.save(function (e, d) 线上有一个异常,我解决了这个问题,但问题是我看到 catch 块根本没有触发,并且节点服务器由于异常而停止。如果我将 try 块放入 user.findOne catch 块将被触发,谁能解释我为什么在节点应用程序中出现这种行为? 谢谢你!

【问题讨论】:

Related question. 不,不是。基本上,原因是try-catch 范围没有涵盖回调函数(带有user.save 行)。您应该使用 .catch 方法(或捕获失败承诺的替代方法)。 @raina77ow 是对的,如果放置在 try 中的一段代码异步执行,则不会触发 try catch。例如,超时的效果相同。 这是一种可能的方式,但不太方便。相反,我建议你承诺你的异步代码。 @raina77ow 我应该使用这个npmjs.com/package/q 库还是有更好的选择? 【参考方案1】:

findOne 方法是异步过程,因此您的 try catch 语句不会捕获 Call Back 方法中发生的异常。您必须将 try catch 语句放在回调方法中以捕获异常。

     user.findOne(
 Email: req.body.email
 , function(e, d) 
 try 
     if (d) 
         res.json(
             'success': false,
             'json': null,
             'message': 'This email already exists!',
             'status': 200
         );
      else 
         var u = new user();
         u.Email = req.body.email;
         u.Password = req.body.password;
         u.Name = req.body.name;
         user.save(function(e, d) 
             res.json(d);
         );
     
  catch (ex) 
     console.log(ex.message + " \n" + ex.stack);
     res.json(
         'success': false,
         'json': ex,
         'message': 'Opps! something wen wrong please try again later!',
         'status': 500
     );
 

 ););

【讨论】:

以上是关于为啥 catch 块不会触发并且应用程序停止在 node.js 中工作的主要内容,如果未能解决你的问题,请参考以下文章

catch(...) 没有捕获异常,我的程序仍然崩溃

为啥使用Try,Catch捕获异常,程序依然Crash

为啥使用Try,Catch捕获异常,程序依然Crash

为啥这个声音循环不会停止?

为啥 Stripe 事件不会触发并且不会被 webhook 接收?

为啥在块外设置时,`scheduledTimer` 会正确触发,而不是在块内?