try...catch
JS中同步過程和ES6中asyn/await函式都可以通過try...catch捕獲異常.多層的try/catch可以傳遞、中斷異常。
try {
return x/y;
} catch(e) {
console.error(e);
}
複製程式碼
try {
try {
...
throw Error("error");
} catch(e) {
console.error("inner");
} finally {
console.error("Final");
}
} catch(e) {
console.error("outer")
}
// ============ console out
// inner
// Final
// outer
複製程式碼
在finally中顯示的return可以中斷error的傳播。參考MSDN try...catch
Promise中的異常處理
Promise異常無法通過try/catch捕獲,而是通過Promise.catch進行處理。
async function() {
try {
await quey();
} catch(e) {
console.log(e);
}
}
複製程式碼
Promise.resolve().then((resolve, reject) => {
throw Error("Error");
}).catch((e) => {console.log(e});
複製程式碼
問題
Promise使用時不一定會記得處理異常,導致Promise一直處於pending的狀態。NodeJS提供了一個事件來監聽是否原生的Promise進行了異常處理
process.on('unhandledRejection', function (err, p) {
console.error('catch exception:',err.stack)
});
複製程式碼