亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Node錯誤處理筆記之挖坑系列教程

2019-11-19 13:43:08
字體:
來源:轉載
供稿:網友

前言

前段時間要在項目中加上日志的上報,順勢了解了下怎么在node中完善錯誤信息的收集。下面話不多說了,來一起看看詳細的介紹吧

01 Error

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

02 錯誤拋出幾種方式

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

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

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

03 錯誤捕獲幾種方式

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

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

*EventEmitter *

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

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

*Process *

Process 進程對象也是 EventEmitter 的實例,可通過如下兩事件監聽 error。

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

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

04 小結

說了這么多,就做個小小總結吧  以上關系網可以概括為如圖:

個人見解,實際處理中基于幾點準則:

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

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

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

koa 項目為例:

05 源碼解讀

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

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

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

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

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

_fatalException 在觸發 "uncaughtException" 事件前其實是會優先檢查 domain 是否存在,當 domain 不存在時才會調用 uncaughtException 的,但 domain 這個已經被廢除了,也就不累述了。

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

06 END

參考網站:  https://v8.paulfryzel.com/docs/master/index.html

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久久久东京| 国产拍精品一二三| 日韩毛片在线观看| 欧美大尺度在线观看| 成人黄色免费片| 欧美自拍视频在线观看| 亚洲人成电影网站色xx| 国产精品美女午夜av| 久久艳片www.17c.com| 国产日韩精品综合网站| 91中文精品字幕在线视频| 国产精品青青在线观看爽香蕉| 日韩精品免费一线在线观看| www日韩中文字幕在线看| 欧美成人免费网| 久久久免费观看视频| 98精品在线视频| 欧美日韩国产中字| 中文字幕亚洲无线码a| 国产经典一区二区| 日韩av中文字幕在线| 成人欧美一区二区三区在线湿哒哒| 国产91热爆ts人妖在线| 日韩欧美在线播放| 国产精品视频久久久久| 一区二区在线免费视频| 亚洲美女精品成人在线视频| 久久久噜噜噜久久中文字免| 欧美大片免费观看| 成人精品久久av网站| 亚洲午夜国产成人av电影男同| 这里只有精品在线观看| 555www成人网| 国产在线观看不卡| 91热精品视频| 欧洲s码亚洲m码精品一区| 国产精品高潮呻吟视频| 成人午夜在线影院| 亚洲国产成人91精品| 国产成人亚洲综合| 国产中文欧美精品| 久久免费视频在线观看| 国产成人精品视频| 欧美在线视频观看免费网站| 福利视频第一区| 日韩av免费在线播放| 国产精品网站视频| 欧美精品18videos性欧| 欧美特黄级在线| 日韩不卡在线观看| 美女精品视频一区| 国产精品三级美女白浆呻吟| 久久6免费高清热精品| 国产xxx69麻豆国语对白| 亚洲第一av在线| 国产亚洲视频中文字幕视频| 伦伦影院午夜日韩欧美限制| 国产精品青青在线观看爽香蕉| 日韩精品视频在线观看免费| 亚洲综合中文字幕68页| 亚洲电影免费观看高清完整版在线| 欧美国产极速在线| 亚洲国产古装精品网站| 亚洲人成亚洲人成在线观看| 国产精品久久久久久久久久小说| 国产美女主播一区| 国产美女被下药99| 久久九九全国免费精品观看| 中文字幕日韩欧美| 清纯唯美日韩制服另类| 国产91精品视频在线观看| 国产午夜精品全部视频播放| 国产精品影片在线观看| 亚洲片av在线| 88xx成人精品| 久久久久国产一区二区三区| 欧美高清在线观看| 26uuu亚洲国产精品| 日韩中文字幕免费视频| 欧美日韩亚洲天堂| 精品成人国产在线观看男人呻吟| 国产精品丝袜久久久久久高清| 92版电视剧仙鹤神针在线观看| 国产成人福利视频| 日韩中文视频免费在线观看| 日韩精品在线看| 亚洲第一国产精品| 国内精品视频一区| 亚洲少妇激情视频| 国产精品自拍小视频| 中文字幕精品一区二区精品| 狠狠久久五月精品中文字幕| 久久久久久久成人| 久久精品国产电影| www.99久久热国产日韩欧美.com| 国产精品高清在线观看| 亚洲欧美国产精品va在线观看| 亚洲最大福利视频网| 欧美成人亚洲成人日韩成人| 欧美日韩国产成人| 中文字幕自拍vr一区二区三区| 日韩av黄色在线观看| 亚洲理论片在线观看| 成人美女免费网站视频| 欧美成人激情图片网| 久久久久久久久久久av| 亚洲xxxx妇黄裸体| 亚洲激情视频在线观看| 亚洲欧美国产精品专区久久| 日韩av在线导航| 国产精品99一区| 国产精品96久久久久久| 亚洲国产成人爱av在线播放| 92福利视频午夜1000合集在线观看| 国产98色在线| 欧美午夜视频一区二区| 精品毛片网大全| 亚洲大胆人体在线| 中文字幕亚洲欧美日韩在线不卡| 成人乱色短篇合集| 国模私拍视频一区| 亚洲国产三级网| 日韩精品欧美国产精品忘忧草| 免费91麻豆精品国产自产在线观看| 亚洲成人动漫在线播放| 中文亚洲视频在线| 精品久久久在线观看| 国产精品视频一区国模私拍| 欧美日本黄视频| 国产综合视频在线观看| 亚洲理论电影网| 91色视频在线观看| 久久久久久999| 永久免费精品影视网站| 亚洲成人xxx| 一区二区三区高清国产| 91爱爱小视频k| 日韩美女视频在线观看| 欧美日韩午夜视频在线观看| 91精品国产高清自在线看超| 国产精品第2页| 88xx成人精品| 久久精品国产一区二区三区| 国产精选久久久久久| 91国产在线精品| 日韩成人在线视频观看| 成人av在线天堂| 成人精品一区二区三区电影黑人| 97在线免费视频| 在线观看精品国产视频| 欧美精品午夜视频| 日韩中文字幕在线| 成人信息集中地欧美| 97视频在线观看免费高清完整版在线观看| 中文字幕日韩精品有码视频| 色综合久久久久久中文网| 日韩中文字幕第一页| 国产91对白在线播放| 欧美性猛交xxxx富婆弯腰| 国产97在线视频| 精品小视频在线| 最新69国产成人精品视频免费| 欧美日韩在线免费观看| 亚洲精品欧美日韩|