最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node錯(cuò)誤處理筆記之挖坑系列教程

 更新時(shí)間:2018年06月05日 09:56:55   作者:techblog  
因?yàn)閚odejs是單線程的,所以一旦發(fā)生錯(cuò)誤或異常,如果沒有及時(shí)被處理整個(gè)系統(tǒng)就會(huì)崩潰。下面這篇文章主要給大家介紹了關(guān)于Node錯(cuò)誤處理筆記之挖坑系列的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧

前言

前段時(shí)間要在項(xiàng)目中加上日志的上報(bào),順勢(shì)了解了下怎么在node中完善錯(cuò)誤信息的收集。下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹吧

01 Error

 JS 中的 Error 對(duì)象,包含了錯(cuò)誤的具體信息,包括 name、message、錯(cuò)誤堆棧 stack 等??梢砸?new Error 方式創(chuàng)建實(shí)例拋出,或調(diào)用 Error.captureStackTrace 為已有對(duì)象添加 stack 錯(cuò)誤堆棧信息 而后拋出。

02 錯(cuò)誤拋出幾種方式

* Throw*:Javascript 拋出的異常,是以 throw 方法拋出,未必都是 Error 的實(shí)例,但通過(guò) nodeJs 或者 js 運(yùn)行時(shí)發(fā)生的錯(cuò)誤,都是 Error 的實(shí)例。

* EventEmitter*:Nodejs 形式的錯(cuò)誤回調(diào),大部分流 & 異步事件都衍生自 EventEmitter 類 || 實(shí)例,如 fs, process, stream 等。

 Process:程序運(yùn)行過(guò)程中拋出的異常,或由底層庫(kù)拋出,或是運(yùn)行中發(fā)生的一些 SyntaxError 之類。

03 錯(cuò)誤捕獲幾種方式

try .. catch:常用的一種捕獲錯(cuò)誤方式,瀏覽器 || node 環(huán)境均適用。

缺點(diǎn):只針對(duì)同步異常有效。

*EventEmitter *

由 Events 模塊提供的 EventEmitter 類,基于 Observer 模式做的 publish/subscribe,通過(guò) .on('error', ...)|| .addEventlistener('error', ...) 注冊(cè) subscriber,.emit() 發(fā)布事件,但會(huì)有最大的 maxListener 的限制,可更改。 

不 show 源碼了,特別簡(jiǎn)單,自己去 look 一下。如 koa 的 app 就是基于 EventEmitter 的擴(kuò)展,因此可以通過(guò)監(jiān)聽 error。

*Process *

Process 進(jìn)程對(duì)象也是 EventEmitter 的實(shí)例,可通過(guò)如下兩事件監(jiān)聽 error。

unhandledRejection :promise 的回調(diào)報(bào)錯(cuò),可通過(guò)監(jiān)聽該事件 catch,但要注意由于 promise 的 rejection 不知道會(huì)在啥時(shí)候才發(fā)生,所以實(shí)際上可能在 unhandledRejection 事件觸發(fā)后才 catch 了這個(gè)信息,對(duì)應(yīng)有 rejectionHandled 事件監(jiān)聽,如下:

(承上)  uncaughtException  :其余 js 運(yùn)行中發(fā)生 || 拋出的未捕獲錯(cuò)誤,均可通過(guò)監(jiān)聽該事件解決,若不進(jìn)行該事件的監(jiān)聽,發(fā)生異常時(shí),會(huì)直接導(dǎo)致程序 crash。但不建議用這種方式 catch,程序運(yùn)行中的錯(cuò)誤 更應(yīng)該是拋出來(lái),所有的 error 都 catch 的話,豈不是程序都可以看成無(wú) bug 了。but 在打錯(cuò)誤日志的時(shí)候是需要 catch 上報(bào)日志的,但是在上報(bào)完后,需要繼續(xù)把 error throw,對(duì)于 uncaughtException callback 中拋出的異常不會(huì)再捕獲,而是以非 0 的狀態(tài)碼 exit。

04 小結(jié)

說(shuō)了這么多,就做個(gè)小小總結(jié)吧  以上關(guān)系網(wǎng)可以概括為如圖:

個(gè)人見解,實(shí)際處理中基于幾點(diǎn)準(zhǔn)則:

1、對(duì)于需要具象化的錯(cuò)誤信息,也就是我們需要知道具體是哪一塊的錯(cuò)誤,并且在錯(cuò)誤發(fā)生時(shí)即進(jìn)行個(gè)性化處理。這一類型的錯(cuò)誤,在程序中執(zhí)行時(shí)要對(duì)可能會(huì)出錯(cuò)的函數(shù)進(jìn)行 catch,方式有多種:  try ... catch(同步);  或 通過(guò) node 形式的標(biāo)準(zhǔn)錯(cuò)誤回調(diào) (err) => {...}(要求所調(diào)用的方法,支持該種寫法);  或 監(jiān)聽 error 事件 .on('error', err => {...})(要求所調(diào)用的對(duì)象繼承自 EventEmitter 實(shí)例,并內(nèi)部發(fā)生錯(cuò)誤時(shí),會(huì) emit('error'))。

2、promise 形式的錯(cuò)誤,可在 promise 實(shí)例的末尾再引入 .catch,可捕獲該實(shí)例所有 then 中拋出的異常;另外 async 的引入也允許了我們可以如同步操作一樣捕獲錯(cuò)誤。

3、但有時(shí)候程序的運(yùn)行,不可能針對(duì)所有的函數(shù)操作等都去 try ... catch,也不能保證程序運(yùn)行一定就無(wú) bug,但必須要能夠把這些異常都捕獲并上報(bào)。因此 process 的兩個(gè)大 boss:  unhandledRejection & uncaughtException,是必須引入的,在程序最外層引入,且越靠前越好。此外針對(duì) unhandledRejection,為防止說(shuō)把不必要的 rejection 上報(bào),可以在收到事件時(shí),先把被 reject 的 promise 和 error 存儲(chǔ)起來(lái),設(shè)置時(shí)間 maxTimeout ,超過(guò) maxTimeout 仍未收到 rejectionHandled 的 promise 事件,再上報(bào)。

koa 項(xiàng)目為例:

05 源碼解讀

下圖為 node 中對(duì)于 process 的初始化等系列流程:

node.cc 其實(shí)是 node 運(yùn)行主要的文件,其中定義了三個(gè)重載函數(shù) Start,調(diào)用順序?yàn)?3 → 2 → 1,每個(gè)函數(shù)參數(shù)不同處理不同的邏輯;

isolate->AddMessageListener 的監(jiān)聽事件 OnMessage 會(huì)在 js 運(yùn)行發(fā)生錯(cuò)誤時(shí)觸發(fā),嗯,是的,只有 error 才會(huì)傳遞 ;這很好的解釋了為什么 process 監(jiān)聽 uncaughtException 就可以監(jiān)聽到所有的拋出的非 promise 異常;

OnMessage 調(diào)用了 FatalException 函數(shù),F(xiàn)atalException 引用 process.fatalException 并傳入 error (env 是 env.h 中聲明的 Environment 類實(shí)例,fatalexceptionstring 也是其中定義的,返回值為 'fatalException');  以下為 FatalException 函數(shù)的部分內(nèi)容。

在調(diào)用 fatalException 函數(shù)前,先調(diào)用 v8::TryCatch::setVerbose 把 verbose 設(shè)置為 false,則運(yùn)行時(shí)拋出的異常就不會(huì)再觸發(fā) FatalException ;在捕獲到運(yùn)行錯(cuò)誤后,把 exitcode 設(shè)為 7,并返回;這就解釋了為什么在 uncaughtException 時(shí)拋出的異常不會(huì)再重新觸發(fā)回調(diào),要知道 EventEmitter 可沒幫你做這樣的事情。

_fatalException 在觸發(fā) "uncaughtException" 事件前其實(shí)是會(huì)優(yōu)先檢查 domain 是否存在,當(dāng) domain 不存在時(shí)才會(huì)調(diào)用 uncaughtException 的,但 domain 這個(gè)已經(jīng)被廢除了,也就不累述了。

unhandledRejection 事件的觸發(fā)整體思路也差不多,首先會(huì)調(diào)用 SetupPromises 初始化,然后調(diào)用 v8::Isolate::SetPromiseRejectCallback 進(jìn)行監(jiān)聽 ... 并且跟 uncaughtException 不同的是 unhandledRejection 的觸發(fā)只會(huì)打印 warning 并不會(huì)把整個(gè)程序給 crash 了。

06 END

參考網(wǎng)站:  https://v8.paulfryzel.com/docs/master/index.html

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 使用Node.js的async和await進(jìn)行異步編程

    使用Node.js的async和await進(jìn)行異步編程

    使用異步編程可以提高Node.js應(yīng)用程序的性能,而async和await是Node.js中實(shí)現(xiàn)異步編程的一種簡(jiǎn)單且易于使用的方式,可以幫助開發(fā)者避免回調(diào)地獄和處理異步操作時(shí)的錯(cuò)誤
    2023-05-05
  • 詳解如何模擬實(shí)現(xiàn)node中的Events模塊(通俗易懂版)

    詳解如何模擬實(shí)現(xiàn)node中的Events模塊(通俗易懂版)

    這篇文章主要介紹了如何模擬實(shí)現(xiàn)node中的Events模塊(通俗易懂版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Node.js創(chuàng)建HTTP文件服務(wù)器的使用示例

    Node.js創(chuàng)建HTTP文件服務(wù)器的使用示例

    我們的目的比較簡(jiǎn)單,使用Node.js創(chuàng)建一個(gè)HTTP協(xié)議的文件服務(wù)器,你可以使用瀏覽器或其它下載工具到文件服務(wù)器上下載文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Node 搭建一個(gè)靜態(tài)資源服務(wù)器的實(shí)現(xiàn)

    Node 搭建一個(gè)靜態(tài)資源服務(wù)器的實(shí)現(xiàn)

    這篇文章主要介紹了Node 搭建一個(gè)靜態(tài)資源服務(wù)器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • node.js-fs文件系統(tǒng)模塊這是你知道嗎

    node.js-fs文件系統(tǒng)模塊這是你知道嗎

    這篇文章主要為大家詳細(xì)介紹了node.js-fs文件系統(tǒng)模塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • node.js中的fs.close方法使用說(shuō)明

    node.js中的fs.close方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.close方法使用說(shuō)明,本文介紹了fs.close方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • 淺析node中間件及實(shí)現(xiàn)一個(gè)簡(jiǎn)單的node中間件

    淺析node中間件及實(shí)現(xiàn)一個(gè)簡(jiǎn)單的node中間件

    這篇文章主要介紹了淺析node中間件及實(shí)現(xiàn)一個(gè)簡(jiǎn)單的node中間件,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 安裝nvm實(shí)現(xiàn)切換node

    安裝nvm實(shí)現(xiàn)切換node

    這篇文章主要介紹了安裝nvm實(shí)現(xiàn)切換node的詳細(xì)過(guò)程,本文給大家講解的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-06-06
  • Node綁定全局TraceID的實(shí)現(xiàn)方法

    Node綁定全局TraceID的實(shí)現(xiàn)方法

    這篇文章主要介紹了Node 綁定全局 TraceID的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Node.js創(chuàng)建Web、TCP服務(wù)器

    Node.js創(chuàng)建Web、TCP服務(wù)器

    這篇文章主要介紹了用Node.js創(chuàng)建Web服務(wù)器和TCP服務(wù)器的方法和處理技巧,需要的讀者們學(xué)習(xí)一下吧。
    2017-12-12

最新評(píng)論

嘉定区| 嘉善县| 江城| 武宣县| 兴仁县| 军事| 峨眉山市| 海盐县| 石狮市| 孟津县| 海口市| 若尔盖县| 景泰县| 天津市| 闻喜县| 高安市| 兴海县| 弥勒县| 元谋县| 广河县| 紫阳县| 沾益县| 迭部县| 临沭县| 磐安县| 兴和县| 米泉市| 车险| 无极县| 酉阳| 罗平县| 榆树市| 宜兰市| 梁河县| 巨野县| 杨浦区| 广宁县| 凤阳县| 竹北市| 游戏| 三亚市|