Почему node.js не ловит мои ошибки? - PullRequest
7 голосов
/ 26 ноября 2011
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)

Обратите внимание, что если я помещу бросок ВПРАВО ПОСЛЕ do_stuff (), он поймает его.

Как я могу сделать это, даже если я вложил его в другую функцию?

1 Ответ

6 голосов
/ 26 ноября 2011

Это один из недостатков использования NodeJS.Он в основном имеет два метода обработки ошибок;Один из них - использование блоков try / catch, а другой - передача первого аргумента каждой функции обратного вызова в качестве ошибки.

Проблема заключается в асинхронной модели цикла обработки событий.Вы можете использовать событие ' uncaughtException ', чтобы перехватывать ошибки, которые не были обнаружены, но это стало обычной программной парадигмой в 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!");
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...