成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Nodejs異常處理

Youngs / 974人閱讀

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

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

2.導(dǎo)致請(qǐng)求無法被釋放,直至連接超時(shí)。用戶體驗(yàn)體驗(yàn)非常差,我們要做的應(yīng)該是在出錯(cuò)時(shí),給用戶一個(gè)友好的提示,并記錄下此次異常,以便排查。
Node.js中常用的異常處理方式
// 每秒鐘打印一次時(shí)間,確保程序沒有奔潰
(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時(shí),異常還沒有發(fā)生。

try {
    asyncError()
} catch (e) {
    /*異常無法被捕獲,導(dǎo)致進(jìn)程退出*/
    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)建一個(gè)事件監(jiān)聽對(duì)象
let emitter = new events.EventEmitter();
//監(jiān)聽error事件
emitter.addListener("error", function (e) {
    /*處理異常*/
    console.log(e.message)
});
//觸發(fā)error事件
emitter.emit("error", new Error("出錯(cuò)啦"));
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)致進(jìn)程退出*/
        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太過笨重,除了記錄下錯(cuò)誤信息,其他地方不適合使用,domain這個(gè)也可以處理任何類型異常的模塊,顯然是一個(gè)不錯(cuò)的選擇。

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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/83330.html

相關(guān)文章

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

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

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

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

    jsbintask 評(píng)論0 收藏0
  • nodejs之process進(jìn)程小記

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

    Binguner 評(píng)論0 收藏0
  • Nodejs進(jìn)階:核心模塊net入門與實(shí)例講解

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

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

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

    RobinTang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

Youngs

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<