他們已經是一個問題,關於這個話題Node.js的最佳實踐異常處理 - 在異步/等待
Node.js Best Practice Exception Handling
這是舊的,答案是非常過時的,domains
甚至從那時起棄用。
現在在一篇文章中,異步/等待Node.js場景不應該同時考慮同步和異步情況,並在異步函數中拋出異常並拒絕異步函數中的promise,而不是在前一種情況下返回Error
實例。
let divideSync = function(x,y) {
// if error condition?
if (y === 0) {
// "throw" the error
throw new Error("Can't divide by zero exception")
}
else {
// no error occured, continue on
return x/y
}
}
模擬異步除法運算
let divideAsync = function(x, y) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
// if error condition?
if (y === 0) {
// "throw" the error safely by rejecting the promise
reject (new Error("Can't divide by zero exception"));
} else {
// no error occured, continue on
resolve(x/y)
}
}, 1000);
})
};
所以,同步和異步異常可以以統一的方式來處理
let main = async function() {
try {
//const resultSync = divideSync(4,0);
const resultAsync = await divideAsync(4,0);
}
catch(ex) {
console.log(ex.message);
}
}
所以按照規則,如果一個異步函數使用異步然後拋出錯誤,如果沒有的話拒絕錯誤 –
沒有,即使函數不使用'async'語法,但如果你願意的話,你可以並且應該''拋出'(或者'返回Promise.reject(...)')promise promise, 1000))然後(()=> {if(y === 0)拋出新的錯誤(...)否則返回x/y})' – Bergi
爲什麼異常不會被捕獲(未處理)代碼 –