摘要:中常用的異常處理方式每秒鐘打印一次時間,確保程序沒有奔潰模擬同步代碼塊內出現異常模擬異步代碼塊內出現異常方式處理異常異常被捕獲了,我可以繼續執行但是方式無法處理異步代碼塊內出現的異常,你可以理解為執行時,異常還沒有發生。
為什么要處理異常?
1.不處理直接導致程序奔潰,這顯然不是我們想要的 2.導致請求無法被釋放,直至連接超時。用戶體驗體驗非常差,我們要做的應該是在出錯時,給用戶一個友好的提示,并記錄下此次異常,以便排查。Node.js中常用的異常處理方式
// 每秒鐘打印一次時間,確保程序沒有奔潰 (function loop() { console.log(new Date().getTime()) setTimeout(function () { loop() }, 1000) })() // 模擬同步代碼塊內出現異常 let syncError = () => { throw new Error("Sync Error") } // 模擬異步代碼塊內出現異常 let asyncError = () => { setTimeout(function () { throw new Error("Async Error") }, 100) }1、try catch 方式
try { syncError() } catch (e) { /*處理異常*/ console.log(e.message) } console.log("異常被捕獲了,我可以繼續執行")
但是try catch方式無法處理異步代碼塊內出現的異常,你可以理解為執行catch時,異常還沒有發生。
try { asyncError() } catch (e) { /*異常無法被捕獲,導致進程退出*/ console.log(e.message) }2、callback方式
fs.mkdir("/dir", function (e) { if (e) { /*處理異常*/ console.log(e.message) } else { console.log("創建目錄成功") } })3、event 方式
let events = require("events"); //創建一個事件監聽對象 let emitter = new events.EventEmitter(); //監聽error事件 emitter.addListener("error", function (e) { /*處理異常*/ console.log(e.message) }); //觸發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) => { /*異常無法被捕獲,導致進程退出*/ 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)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83330.html
摘要:我們先介紹一下中的的一些調用再結合的應用逐步深入。這就是一些簡單的的調用看起來不多,但是靠這個真得解決了許多必須同步并行的環境本身是一個對象在開始支持。存在兩個回調函數根據個人的需求進行處理。 什么是promise?為什么要在nodejs中使用promise?使用promise到底有什么好處呢?實在太多了,一一說來不如直接上實戰。我們先介紹一下nodejs中的promise的一些調用....
摘要:三中間件實現原理首先需要明確是中間件并不是中的概念,它只是和框架衍生的概念。中間件的執行流程主要由與函數決定依次取出中間件終止條件路由匹配規則函數中使用閉包函數來檢測是否與當前路由相匹配,匹配則執行該上的中間件函數,否則繼續檢查下一個。 Koa作為下一代Web開發框架,不僅讓我們體驗到了async/await語法帶來同步方式書寫異步代碼的酸爽,而且本身簡潔的特點,更加利于開發者結合業務...
摘要:因為進程退出之后將不再執行事件循環,所有只有那些沒有回調函數的代碼才會被執行。此外,創建的回調函數具有隔離性,他們之間不會相互影響。我們來看的一個簡單例子,他創建了一個子進程,第一個參數是一個命令,第二個參數是回調函數,處理返回結果。 雖然node對操作系統做了很多抽象的工作,但是你還是可以直接和他交互,比如和系統中已經存在的進程進行交互,創建工作子進程。node是一個用于事件循環的線...
摘要:模塊概覽模塊是同樣是的核心模塊。在模塊概覽里提到,繼承了,此外,客戶端與服務端的通信均依賴于。正常關閉的同時,會被執行,同時會觸發事件。事實上,中的在內部實現中也是加入了做為事件的監聽函數。默認情況下,會完成自我銷毀操作。 本文摘錄自《Nodejs學習筆記》,更多章節及更新,請訪問 github主頁地址。歡迎加群交流,群號 197339705。 模塊概覽 net模塊是同樣是nodejs...
摘要:它們的作用域只在模塊內,詳見文檔回調函數與一樣,如模塊一個大項目一定是分成一個個模塊的,一般來說,一個文件就是一個模塊。這些對象有一個函數,用于將一個或多個函數綁定到命名事件上。用于注冊監聽器,用于觸發事件。 全局對象 類似的,在瀏覽器中有window全局變量在所有模塊中都可使用。不需要引用等。全局變量如console,setTimeout,require()等 全局變量在所有模塊中都...
閱讀 2471·2021-09-09 09:33
閱讀 2870·2019-08-30 15:56
閱讀 3124·2019-08-30 14:21
閱讀 897·2019-08-30 13:01
閱讀 864·2019-08-26 18:27
閱讀 3588·2019-08-26 13:47
閱讀 3456·2019-08-26 10:26
閱讀 1587·2019-08-23 18:38