我一直在使用節點幾個月。對於異步代碼中的錯誤處理,我一直在關注我知道的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來區分最初拋出的錯誤和通過回調錯誤產生的錯誤。這似乎是我堅持處理一切或沒有。任何人都可以提出一種方法來從可怕的回到壞的?
有道理。幾乎在Java或C#中完成的任務。謝謝! – 2013-02-21 15:31:45