[英]Node.js Best Practice Exception Handling - After Async/Await
他們已經對這個話題提出了疑問
這是舊的,答案非常過時,從那時起, domains
甚至已被棄用。
現在在后期Async / Await 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);
}
}
Node.js最佳實踐異常處理的答案很老,而且已經過時了
沒有那么多。 這個 維護良好的博客文章列表中的答案是最新的。
官方node.js指南始終是一個很好的閱讀,一般的方法並沒有改變那么多。
那變了什么?
async
/ await
所取代。 ( 注意:事件發射器等是不同的情況 ) process.on('uncaughtException')
由process.on('unhandledRejection')
補充 那么這對於公共代碼意味着什么呢?
我們不應該同樣考慮同步和異步情況並在同步函數中拋出異常並拒絕異步函數中的promise而不是返回
Error
實例嗎?
對,就是這樣。 您應該使用Error
s拒絕您的承諾(或者從async function
throw
它們)。
請注意,您很少會自己打電話reject
。 有了承諾,你應該能夠throw
你的代碼。 如果你不能,你可能沒有正確使用它們 - 程序員的錯誤也不會被抓住。
此代碼的黃金法則是: 永遠不要使用非承諾回調的回調。 “Promise回調”指的是new Promise
, then
catch
參數,可能還有一些庫的自定義方法(例如finally
)。 這是您上面的示例代碼有問題的地方。 寫得正確,它應該讀
async function divideAsync(x, y) {
await new Promise(resolve =>
setTimeout(resolve, 1000) // don't even pass a function expression
);
if (y === 0) {
throw new Error("Can't divide by zero exception");
} else {
return x / y;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.