摘要:中常用的異常處理方式每秒鐘打印一次時間,確保程序沒有奔潰模擬同步代碼塊內(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
摘要:我們先介紹一下中的的一些調(diào)用再結(jié)合的應(yīng)用逐步深入。這就是一些簡單的的調(diào)用看起來不多,但是靠這個真得解決了許多必須同步并行的環(huán)境本身是一個對象在開始支持。存在兩個回調(diào)函數(shù)根據(jù)個人的需求進行處理。 什么是promise?為什么要在nodejs中使用promise?使用promise到底有什么好處呢?實在太多了,一一說來不如直接上實戰(zhàn)。我們先介紹一下nodejs中的promise的一些調(diào)用....
摘要:三中間件實現(xiàn)原理首先需要明確是中間件并不是中的概念,它只是和框架衍生的概念。中間件的執(zhí)行流程主要由與函數(shù)決定依次取出中間件終止條件路由匹配規(guī)則函數(shù)中使用閉包函數(shù)來檢測是否與當(dāng)前路由相匹配,匹配則執(zhí)行該上的中間件函數(shù),否則繼續(xù)檢查下一個。 Koa作為下一代Web開發(fā)框架,不僅讓我們體驗到了async/await語法帶來同步方式書寫異步代碼的酸爽,而且本身簡潔的特點,更加利于開發(fā)者結(jié)合業(yè)務(wù)...
摘要:因為進程退出之后將不再執(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)的線...
摘要:模塊概覽模塊是同樣是的核心模塊。在模塊概覽里提到,繼承了,此外,客戶端與服務(wù)端的通信均依賴于。正常關(guān)閉的同時,會被執(zhí)行,同時會觸發(fā)事件。事實上,中的在內(nèi)部實現(xiàn)中也是加入了做為事件的監(jiān)聽函數(shù)。默認情況下,會完成自我銷毀操作。 本文摘錄自《Nodejs學(xué)習(xí)筆記》,更多章節(jié)及更新,請訪問 github主頁地址。歡迎加群交流,群號 197339705。 模塊概覽 net模塊是同樣是nodejs...
摘要:它們的作用域只在模塊內(nèi),詳見文檔回調(diào)函數(shù)與一樣,如模塊一個大項目一定是分成一個個模塊的,一般來說,一個文件就是一個模塊。這些對象有一個函數(shù),用于將一個或多個函數(shù)綁定到命名事件上。用于注冊監(jiān)聽器,用于觸發(fā)事件。 全局對象 類似的,在瀏覽器中有window全局變量在所有模塊中都可使用。不需要引用等。全局變量如console,setTimeout,require()等 全局變量在所有模塊中都...
閱讀 2515·2021-09-09 09:33
閱讀 2876·2019-08-30 15:56
閱讀 3160·2019-08-30 14:21
閱讀 911·2019-08-30 13:01
閱讀 874·2019-08-26 18:27
閱讀 3594·2019-08-26 13:47
閱讀 3465·2019-08-26 10:26
閱讀 1597·2019-08-23 18:38