2013-02-14 56 views
0

考慮以下代碼:在try-catch塊中,是否會出現mongoose.save()拋出錯誤對象的問題?

mongoose.connect('MyDatabaseURL'); 
var sch_obj = {field1: String}; 
var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
    var model_obj = db.model('SchemaName', sch_obj); 
    var obj = new model_obj({field1:'MyValue'}); 
    obj.save(function(err,data){ 
     if(err) 
     console.log('error occurred:' + err); // <=== Case 1 
     else 
     console.log('saved'); 
     }); 
}); 

/* ---------------------------------- */ 

mongoose.connect('MyDatabaseURL'); 
var sch_obj = {field1: String}; 
var db = mongoose.connection; 
db.on('error', console.error.bind(console, 'connection error:')); 
db.once('open', function() { 
    var model_obj = db.model('SchemaName', sch_obj); 
    var obj = new model_obj({field1:'MyValue'}); 
    obj.save(function(err,data){ 
     try { 
      console.log('saved'); 
     } 
     catch(err)       // <=== Case 2 
     { 
     console.log('error occurred:' + err); 
     } 
    }); 
}); 

問題:他們是一樣的嗎?如果是,哪一個是處理錯誤的好方法?

回答

0

不,他們是不一樣的。更新的貓鼬引發錯誤,所以你會更新的捕獲錯誤。這就是爲什麼您不能使用try ... catch ...聲明來處理貓鼬錯誤。

因此,唯一正確的做法是:

obj.save(function(err,data){ 
    if(err) 
    console.log('error occurred:' + err); 
    else 
    // err == null 
    console.log('saved'); 
    }); 

其背後的原因是,throw終止當前進程,除非它抓住了。因此,大多數nodejs模塊(例如express,mongoose等)使用回調傳遞它們的錯誤,而不是拋出它們,這是nodejs中的一種常見做法。

+0

任何支持文檔鏈接都將有很大的幫助..感謝您的快速回答... – 2013-02-14 10:15:46

+0

@AmolMKulkarni,請參閱[Mongoose Docs](http://mongoosejs.com/docs/models.html)瞭解更多適當的例子錯誤處理。 – 2013-02-14 10:18:18

相關問題