成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Nodejs異常處理

Youngs / 929人閱讀

摘要:中常用的異常處理方式每秒鐘打印一次時間,確保程序沒有奔潰模擬同步代碼塊內(nèi)出現(xiàn)異常模擬異步代碼塊內(nèi)出現(xiàn)異常方式處理異常異常被捕獲了,我可以繼續(xù)執(zhí)行但是方式無法處理異步代碼塊內(nèi)出現(xiàn)的異常,你可以理解為執(zhí)行時,異常還沒有發(fā)生。

為什么要處理異常?
1.不處理直接導(dǎo)致程序奔潰,這顯然不是我們想要的

2.導(dǎo)致請求無法被釋放,直至連接超時。用戶體驗體驗非常差,我們要做的應(yīng)該是在出錯時,給用戶一個友好的提示,并記錄下此次異常,以便排查。
Node.js中常用的異常處理方式
// 每秒鐘打印一次時間,確保程序沒有奔潰
(function loop() {
    console.log(new Date().getTime())
    setTimeout(function () {
        loop() 
    }, 1000)
})()
// 模擬同步代碼塊內(nèi)出現(xiàn)異常
let syncError = () => {
    throw new Error("Sync Error")
}
// 模擬異步代碼塊內(nèi)出現(xiàn)異常
let asyncError = () => {
    setTimeout(function () {
        throw new Error("Async Error")
    }, 100)
}
1、try catch 方式
try {
    syncError()
} catch (e) {
    /*處理異常*/
    console.log(e.message)
}
console.log("異常被捕獲了,我可以繼續(xù)執(zhí)行")

但是try catch方式無法處理異步代碼塊內(nèi)出現(xiàn)的異常,你可以理解為執(zhí)行catch時,異常還沒有發(fā)生。

try {
    asyncError()
} catch (e) {
    /*異常無法被捕獲,導(dǎo)致進程退出*/
    console.log(e.message)
}

2、callback方式
fs.mkdir("/dir", function (e) {
    if (e) {
        /*處理異常*/
        console.log(e.message)
    } else {
        console.log("創(chuàng)建目錄成功")
    }
})
3、event 方式
let events = require("events");
//創(chuàng)建一個事件監(jiān)聽對象
let emitter = new events.EventEmitter();
//監(jiān)聽error事件
emitter.addListener("error", function (e) {
    /*處理異常*/
    console.log(e.message)
});
//觸發(fā)error事件
emitter.emit("error", new Error("出錯啦"));
4、Promise 方式
new Promise((resolve, reject) => {
    syncError()
    /* or
    try{
        syncError()
    }catch(e){
        reject(e)
    }
    */
})
    .then(() => {
        //...
    })
    .catch((e) => {
        /*處理異常*/
        console.log(e.message)
    })

Promise同樣無法處理異步代碼塊中拋出的異常

new Promise((resolve, reject) => {
    asyncError()
})
    .then(() => {
        //...
    })
    .catch((e) => {
        /*異常無法被捕獲,導(dǎo)致進程退出*/
        console.log(e.message)
    })

5、Async/Await 方式

Async/Await是基于Promise的,所以Promise無法捕獲的異常,Async/Await同樣無法捕獲

var sleep = function (time) {
    return new Promise(function (resolve, reject) {
        syncError()
    })
};

(async function () {
    try {
        await sleep(100);
    } catch (e) {
        /*處理異常*/
        console.log(e.message)
    }
})()
6、process方式

process方式可以捕獲任何異常(不管是同步代碼塊中的異常還是異步代碼塊中的異常)

process.on("uncaughtException", function (e) {
    /*處理異常*/
    console.log(e.message)
});
asyncError()
syncError()
7、domain方式

process方式雖然可以捕獲任何類型的異常,但是process太過笨重,除了記錄下錯誤信息,其他地方不適合使用,domain這個也可以處理任何類型異常的模塊,顯然是一個不錯的選擇。

let domain = require("domain")
let d = domain.create()
d.on("error", function (e) {
    /*處理異常*/
    console.log(e.message)
})
d.run(asyncError)
d.run(syncError)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/83330.html

相關(guān)文章

  • 在非阻塞IO下的nodejs下的同步并行 ES6的 promise 從入門深入(一)

    摘要:我們先介紹一下中的的一些調(diào)用再結(jié)合的應(yīng)用逐步深入。這就是一些簡單的的調(diào)用看起來不多,但是靠這個真得解決了許多必須同步并行的環(huán)境本身是一個對象在開始支持。存在兩個回調(diào)函數(shù)根據(jù)個人的需求進行處理。 什么是promise?為什么要在nodejs中使用promise?使用promise到底有什么好處呢?實在太多了,一一說來不如直接上實戰(zhàn)。我們先介紹一下nodejs中的promise的一些調(diào)用....

    luffyZh 評論0 收藏0
  • 玩轉(zhuǎn)Koa -- 核心原理分析

    摘要:三中間件實現(xiàn)原理首先需要明確是中間件并不是中的概念,它只是和框架衍生的概念。中間件的執(zhí)行流程主要由與函數(shù)決定依次取出中間件終止條件路由匹配規(guī)則函數(shù)中使用閉包函數(shù)來檢測是否與當(dāng)前路由相匹配,匹配則執(zhí)行該上的中間件函數(shù),否則繼續(xù)檢查下一個。 Koa作為下一代Web開發(fā)框架,不僅讓我們體驗到了async/await語法帶來同步方式書寫異步代碼的酸爽,而且本身簡潔的特點,更加利于開發(fā)者結(jié)合業(yè)務(wù)...

    jsbintask 評論0 收藏0
  • nodejs之process進程小記

    摘要:因為進程退出之后將不再執(zhí)行事件循環(huán),所有只有那些沒有回調(diào)函數(shù)的代碼才會被執(zhí)行。此外,創(chuàng)建的回調(diào)函數(shù)具有隔離性,他們之間不會相互影響。我們來看的一個簡單例子,他創(chuàng)建了一個子進程,第一個參數(shù)是一個命令,第二個參數(shù)是回調(diào)函數(shù),處理返回結(jié)果。 雖然node對操作系統(tǒng)做了很多抽象的工作,但是你還是可以直接和他交互,比如和系統(tǒng)中已經(jīng)存在的進程進行交互,創(chuàng)建工作子進程。node是一個用于事件循環(huán)的線...

    Binguner 評論0 收藏0
  • Nodejs進階:核心模塊net入門與實例講解

    摘要:模塊概覽模塊是同樣是的核心模塊。在模塊概覽里提到,繼承了,此外,客戶端與服務(wù)端的通信均依賴于。正常關(guān)閉的同時,會被執(zhí)行,同時會觸發(fā)事件。事實上,中的在內(nèi)部實現(xiàn)中也是加入了做為事件的監(jiān)聽函數(shù)。默認情況下,會完成自我銷毀操作。 本文摘錄自《Nodejs學(xué)習(xí)筆記》,更多章節(jié)及更新,請訪問 github主頁地址。歡迎加群交流,群號 197339705。 模塊概覽 net模塊是同樣是nodejs...

    LdhAndroid 評論0 收藏0
  • Node.js基礎(chǔ) 23456:全局對象,回調(diào)函數(shù),模塊,事件,讀寫文件(同步,異步)

    摘要:它們的作用域只在模塊內(nèi),詳見文檔回調(diào)函數(shù)與一樣,如模塊一個大項目一定是分成一個個模塊的,一般來說,一個文件就是一個模塊。這些對象有一個函數(shù),用于將一個或多個函數(shù)綁定到命名事件上。用于注冊監(jiān)聽器,用于觸發(fā)事件。 全局對象 類似的,在瀏覽器中有window全局變量在所有模塊中都可使用。不需要引用等。全局變量如console,setTimeout,require()等 全局變量在所有模塊中都...

    RobinTang 評論0 收藏0

發(fā)表評論

0條評論

Youngs

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<