2013-02-21 70 views
2

我一直在使用節點幾個月。對於異步代碼中的錯誤處理,我一直在關注我知道的best practice,它是通過回調錯誤參數來處理錯誤,並讓大多數異常冒出來並使應用程序崩潰,因爲沒有真正的乾淨地恢復的方式。node.js處理與Q的異常

我正在與一個開發人員合作使用Q,他正在使用Q.nfbind調用一些基於回調的函數。但是,這給我頭痛的錯誤處理。例如,假設我有一個可以用一個錯誤回調函數:

function doSomething(x, callback) { 
    dbpool.acquire(function(err, conn) { 
     if (err) return callback(err); 

     conn.query('INSERT INTO some_table (x) VALUES (?)', [x], 
     function(err, result) { 
      dbpool.release(conn); 
      if (err) return callback(err); 
      callback(null, result.insertId); 
     }); 
} 
var qDoSomething = Q.nfbind(doSomething); 

齊則可以調用qDoSomething和處理錯誤OK:

qDoSomething('abc') 
.fail(function(err) { 
    ... 
}); 

現在假設我工作得晚一晚,並在檢查代碼這樣我的DoSomething的()函數內部就在查詢之前:

var foo; 
foo.doAnotherThing(); 

在我的前-Q世界中,這是不好的。將引發異常,這會導致應用程序崩潰,並且會永久重啓。但是,一旦應用程序重新啓動,它至少可以正常工作,直到再次訪問此代碼路徑。但是,對於Q,此異常現在由失敗處理程序捕獲並處理。這個處理程序不能修復這個破壞,因爲它對連接池一無所知。現在,每次這條代碼路徑被擊中時,連接都會從池中泄漏出來,最終導致應用程序被堵塞。這個bug的影響只是從糟糕到糟糕。

我不知道用Q來區分最初拋出的錯誤和通過回調錯誤產生的錯誤。這似乎是我堅持處理一切或沒有。任何人都可以提出一種方法來從可怕的回到壞的?

回答

1

子類化Error如何包裝那些err的?

var MyError = function() { 
    Error.apply(this, arguments); 
}; 

var generateError = function(callback) { 
    callback(new MyError('some reason')); 
}; 
var doSomething = q.nfbind(generateError); 

doSomething() 
    .fail(function(e) { 
    console.log('Was this a MyError instance?', e instanceof MyError); 
    }); 
+0

有道理。幾乎在Java或C#中完成的任務。謝謝! – 2013-02-21 15:31:45