javascript - 为什么 node.js 没有发现我的错误?

标签 javascript debugging exception node.js error-handling

var api_friends_helper = require('./helper.js');
try{
    api_friends_helper.do_stuff(function(result){
        console.log('success');
    };
}catch(err){
    console.log('caught error'); //this doesn't hit!
}

do_stuff 中,我有:

function do_stuff(){
    //If I put the throw here, it will catch it! 
    insert_data('abc',function(){
        throw new Error('haha');
    });
}

为什么它从不记录“捕获错误”?相反,它将堆栈跟踪和错误对象打印到屏幕上:

{ stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'haha' }
Error: haha
    at /home/abc/kj/src/api/friends/helper.js:18:23
    at /home/abc/kj/src/api/friends/db.js:44:13
    at Query.<anonymous> (/home/abc/kj/src/node_modules/mysql/lib/client.js:108:11)
    at Query.emit (events.js:61:17)
    at Query._handlePacket (/home/abc/kj/src/node_modules/mysql/lib/query.js:51:14)
    at Client._handlePacket (/home/abc/kj/src/node_modules/mysql/lib/client.js:312:14)
    at Parser.<anonymous> (native)
    at Parser.emit (events.js:64:17)
    at /home/abc/kj/src/node_modules/mysql/lib/parser.js:71:14
    at Parser.write (/home/abc/kj/src/node_modules/mysql/lib/parser.js:576:7)

请注意,如果我将 throw 放在 do_stuff() 之后,它就会捕捉到它。

即使我将它嵌套在另一个函数中,我怎样才能让它被捕获?

最佳答案

这是使用 NodeJS 的缺点之一。它基本上有两种处理错误的方法;一种是使用 try/catch block ,另一种是将每个回调函数的第一个参数作为错误传递。

问题是因为事件循环异步模型。您可以使用 ' uncaughtException ' 事件来捕获 Uncaught Error ,但它已成为 Node.JS 中的常用程序范例,使用回调函数的第一个参数来显示是否有任何错误,例如:(我以前从未将 MySQL 与 NodeJS 一起使用,只是举个一般的例子)

function getUser( username, callback ){
    mysql.select("SELECT username from ...", function(err,result){
        if( err != null ){
            callback( err );
            return;
        }

        callback( null, result[0]);
    });
}    

getUser("MyUser", function(err, user){
    if( err != null )
        console.log("Got error! ", err );
    else
        console.log("Got user!");
});

关于javascript - 为什么 node.js 没有发现我的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8276132/

相关文章:

javascript - 如何使用 javascript 转换日期文本?

delphi - 如果使用调试编译器设置编译 exe 文件,逆向工程或破坏 Delphi 程序是否更容易?

java - 正在运行的调试测试

javascript - javascript/node.js 中的 lambda 会捕获异常吗?

.net - LINQ 和 .COUNT 超时

javascript - 当它们全部堆叠在 Javascript 中时,如何同时触发一种声音?

javascript - ReactJS:让函数同时访问父子 Prop ?

wpf - 为什么我无法在 VS 中单步执行 WPF 源代码?

java - 为什么 Java Runtime - unChecked exception 需要子类化

javascript - 使用 JSSIP/WebRTC 的 SIP 调用启动延迟 40 秒