記錄Javascript 異常捕獲

shirleyR發表於2019-04-18

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)
});
複製程式碼

Node.js內部是如何捕獲非同步錯誤的

相關文章