摘要:中常用的異常處理方式每秒鐘打印一次時(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
摘要:我們先介紹一下中的的一些調(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)用....
摘要:三中間件實(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ù)...
摘要:因?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)的線...
摘要:模塊概覽模塊是同樣是的核心模塊。在模塊概覽里提到,繼承了,此外,客戶端與服務(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...
摘要:它們的作用域只在模塊內(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()等 全局變量在所有模塊中都...
閱讀 2574·2021-09-09 09:33
閱讀 2940·2019-08-30 15:56
閱讀 3209·2019-08-30 14:21
閱讀 964·2019-08-30 13:01
閱讀 957·2019-08-26 18:27
閱讀 3661·2019-08-26 13:47
閱讀 3533·2019-08-26 10:26
閱讀 1658·2019-08-23 18:38