2015-09-06 4 views
0

У меня есть некоторый код, как удар, если бросок 1, дисплей будетНе удается поймать ошибку в nodejs и MongoDB

catch in main 
throw 1 

если бросок 2, дисплей будет

catch in test 
throw 2 

, но если Я хочу показать, как это,

catch in test 
throw 2 
catch in main 
throw 2 

как я могу это сделать?

function test(database) 
{ 
    if(1) throw 'throw 1'; //if throw at here, 'catch in main' will display 
    var col=database.collection('profiles'); 
    col.findOne({"oo" : 'xx'}) 
    .then(function(doc){ 
     throw 'throw 2'; //if throw at here, 'catch in main' will [NOT] display 
    }) 
    .catch(function(e){ 
    console.log('catch in test'); 
    console.log(e); 
    throw e; 
    }); 
} 

MongoClient.connect(url, function(err, database) { 
    try{ 
    test(database); 
    }catch(e){ 
    console.log('catch in main'); //if throw 2, this line will [NOT] run 
    console.log(e); 
    } 
}); 

ответ

0

При использовании обещания (и вы в этом случае), есть небольшое использование оберточной клиентского кода в try-catch. Что вы должны сделать, это 1) вернуть обещание от test функции; 2) подпишитесь на возвращаемое обещание «отклонить» с помощью метода catch. Один из возможных подходов:

// in test() 
return col.findOne({"oo" : 'xx'}) 
.then(function(doc){ 
    throw 'throw 2'; //if throw at here, 'catch in main' will [NOT] display 
}) 
.catch(function(e){ 
    console.log('catch in test'); 
    console.log(e); 
    throw e; // 
}); 

// in main: 
function handleError(e) { 
    console.log('catch in main'); 
    console.log(e); 
} 

// ... 
try { 
    test(database).catch(handleError); 
} catch(e) { 
    handleError(e); 
} 

Кстати, мне кажется, ваш первый пример (с метания в собственном коде) искусственно (введен только, чтобы в общих работах убеждаться try-catch), и в вашем реальном случае это только функции БД, которые могут закончиться ошибкой. Если я прав, вы можете полностью избавиться от этого блока try-catch: обещания .catch обработчика будет достаточно.

Смежные вопросы