欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Node錯誤處理的示例分析

小編給大家分享一下Node錯誤處理的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

員工經(jīng)過長期磨合與沉淀,具備了協(xié)作精神,得以通過團(tuán)隊的力量開發(fā)出優(yōu)質(zhì)的產(chǎn)品。創(chuàng)新互聯(lián)堅持“專注、創(chuàng)新、易用”的產(chǎn)品理念,因為“專注所以專業(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡單”。公司專注于為企業(yè)提供成都網(wǎng)站建設(shè)、成都做網(wǎng)站、微信公眾號開發(fā)、電商網(wǎng)站開發(fā),小程序開發(fā),軟件按需網(wǎng)站設(shè)計等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。

01 Error

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

Node錯誤處理的示例分析

02 錯誤拋出幾種方式

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

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

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

03 錯誤捕獲幾種方式

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

缺點:只針對同步異常有效。

Node錯誤處理的示例分析

*EventEmitter *

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

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

Node錯誤處理的示例分析

*Process *

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

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

Node錯誤處理的示例分析

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

Node錯誤處理的示例分析

04 小結(jié)

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

Node錯誤處理的示例分析

個人見解,實際處理中基于幾點準(zhǔn)則:

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

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

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

koa 項目為例:

Node錯誤處理的示例分析

05 源碼解讀

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

Node錯誤處理的示例分析

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

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

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

Node錯誤處理的示例分析

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

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

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

以上是“Node錯誤處理的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

網(wǎng)站欄目:Node錯誤處理的示例分析
分享鏈接:http://aaarwkj.com/article36/gihssg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈、外貿(mào)建站動態(tài)網(wǎng)站、微信小程序網(wǎng)頁設(shè)計公司、網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營
男同午夜视频在线观看| 不卡视频一区二区日韩| 少妇熟女视频一区二区三区| 日本人妻中文字幕在线一区| 丝袜美腿精尽福利视频网址大全| 亚洲国产视频不卡一区| 日韩欧美国产成人在线观看| 亚洲av中文久久精品国内| 最新日韩人妻中文字幕一区| av在线亚洲网站区一| 亚洲国产一区二区高清| 2004年亚洲中文字幕| 亚洲日本在线观看午夜视频| 黄色成人av免费看| 国产精品成人亚洲一区二区| 成人爱爱在线视频免费观看| 亚洲av日韩高清在线观看| 人妻久久一区二区三区精品99| 亚洲最大午夜福利视频| 中文字幕一区二区久久综合| 亚洲丰满老熟女激情av| 日韩欧美黄片一区二区三区| 国产女主播精品视频一区| 久久精品女人天堂av免费观看 | 国产精品亚洲二区三区三州| 一区二区三区蜜桃av| 欧美亚洲精品一区二区三区| 久久精品人妻麻豆尤物| 国产精品一区二区三区激情 | 黑寡妇精品欧美一区二区毛| 亚洲av日韩高清在线观看 | 欧美日韩国产精品精品| 成人激情电影免费在线| 五月婷婷六月丁香伊人妞| 夫妻性生活在线视频一级片| av天堂午夜精品蜜臀| 日韩国产欧美亚洲一区| 国产在线成年人免费观看| 日本人妻精品一区二区| 日韩不卡在线观看免费| 91精品中综合久久久久|