摘要:總結一下以便有更清晰的認知。隱藏的異常說明隱藏的異常不是由觸發而是在運行時發生的例如上面常見的這種異常可以使用等工具檢查出來。使用域的好處是可以把各式異常放到一個域的異常處理函數中且不影響其他的域。在非阻塞式中一般都是用集中處理異常。
引言
異常分類 顯式異常對錯誤進行分類,理解錯誤是如何產生的,以及錯誤發生后怎么定位解決,這在構建一個穩定運行的程序過程中會經常遇到。總結一下,以便有更清晰的認知。
function validateName(name) { if(!name){ throw new Error("name is required"); } } try { validateName(); }catch (err){ console.log(err.message,err.stack); }
說明 有以下幾點需要注意
一般用于同步方法,或者異步執行前,否則無法捕獲異常,process直接exit。
拋出的錯誤一般都是繼承于Error。使用簡單的字符串例如(throw "error happen")無法獲得調試堆棧信息。
不要在內置的node方法中拋出異常,沒有意義,因為在node中回調函數第一個參數就是錯誤對象,可以直接處理。
隱藏的異常function getName() { return name; } getName();
說明 隱藏的異常不是由throw觸發,而是在運行時發生的,例如上面常見的ReferenceError,這種異常可以使用eslint等工具檢查出來。
no-undef:error錯誤事件
var EventEmitter=require("events").EventEmitter; var ee=new EventEmitter(); ee.on("error",function (err) { console.error(err.message,err.stack); console.log("end"); }); ee.emit("error",new Error("no handled event error"));
說明 當EventEmitter實例發生錯誤時,會觸發error事件,如果沒有error事件的監聽器,默認會打印堆棧,然后退出程序。如果實例比較多,想要統一管理,可以使用domain模塊管理。例如下面的示例,集中處理connection時發生的異常。
var domain=require("domain"); var http=require("http"); var d=domain.create(); d.run(function () { var server=http.createServer(function (req,res) { d.on("error",function () { res.statusCode=500; res.end("internal server error"); server.close(); setTimeout(process.exit,5000,1); }) response.end("hello world"); }).listen(3000); });
使用域的好處是,可以把各式異常放到一個域的異常處理函數中,且不影響其他的域。在非阻塞式api中,一般都是用domain集中處理異常。想要全局處理,可以按照下面的方式來個統一處理,不推薦。
var http=require("http"); var server=http.createServer(function (req,res) { response.end("hello world"); }).listen("3000"); process.on("uncaughtException",function (err) { console.log(err); })
uncaughtException是最后一道防線,比較好的做法是記錄錯誤信息,然后重啟。
錯誤參數fs.readFile("./config.json",function (err,buf) { // if(err) throw err; if(err) throw new Error("read file filed");; var config=JSON.parse(buf.toString()); console.log(config); })
說明 上述示例中,如果忽略readFile返回的錯誤,有可能無法獲取buf而拋出異常,所以錯誤參數還是需要處理一下。
問題debug比較low的方法就是console或者打日志,這個在開發中不用,打日志一般是用來記錄查看線上問題;開發中一般都是斷點調試,重點分析下。
調試方式一Node.js 6.3以下,使用老的方式話,node-inspect作為模塊需要多帶帶安裝,其作用通過websocket的方式充當一個連接通道,負責dev tool和node中運行程序產生的debug信息進行通信。
node-inspector & ;node-debug app.js
出現下圖所示就代表成功了。
node6.3+中, node --inspect app.js ,使用前開啟chrome的Node debugging選項,出現下面效果標識就成功了。
說明 上述兩種調試方式,我很少用,一般我都是用webstrome來調試,通過調整Node Interpreter的版本來使用相應的調試方式,原理和上面是一樣的,只是調試形式上變化了下。
7以上我通常都是用 --inspect的方式,否則會提示你"node --debug is deprecated",但是用老方式也沒什么問題。區別其實就是獲取debug信息的通信協議方式不同,新的方式使用的是Chrome Debugging Protocol,而老的是 V8 Debugging Protoco。
總結上面我只是總結了通用的異常情況,其實還有一些特殊的使用方式,例如throw在generator當中的使用,以及promise中可以直接拋出異常,都不是我上面所說的一般情況,不在列舉,
因為阮老師關于這兩個api的論述很詳細,此處不在贅述。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/83243.html
摘要:但如果忽視異常輕則影響功能運行,重則導致系統崩潰,造成經濟損失。異常處理捕獲異常捕獲關鍵字與一致,都是使用。語句塊表示無論是否發生異常,語句塊代碼一定會被執行。 不少前端工程師看到這個標題可能會產生質問: 我js用得好好的,能后端能APP,為什么還要學習Python? 至少有下面兩個理由: 學習曲線。ES6之后的JavaScript(TypeScript)的在語法上和Python有很...
摘要:加載百度地圖后報錯的,我們再加載一遍你的秘鑰你的秘鑰為當前時間戳獲取方法 一、環境搭建 1、安裝node.js在計算機中https://nodejs.org/en/download/ (此為node.js官方下載地址)安裝完成后打開cmd命令提示符 node -v //查詢node版本號 npm -v //查詢npm版本號 2、如果npm使用網速跟不上...
摘要:一中的對象包含了錯誤的具體信息,包括錯誤堆棧等。不源碼了,特別簡單,自己去一下。 一. Error ????JS 中的 Error 對象. 包含了錯誤的具體信息,包括 name、message、錯誤堆棧 stack 等。可以以 new Error 方式創建實例拋出,或調用 Error.captureStackTrace 為已有對象添加 stack 錯誤堆棧信息 而后拋出showImg(...
摘要:日志規范一般前端開發同學,對日志其實不太敏感,畢竟前端大多數情況下,不太關心日志。本文主要梳理了目前我們團隊在開發中日志方面存在的問題,以及通過統一日志規范,希望達到什么樣的效果。日志格式字段日志格式統一采用,便于解析處理。nodejs 日志規范 一般前端開發同學,對日志其實不太敏感,畢竟前端大多數情況下,不太關心日志。即使有,也可能調用一些第三方的統計,比如百度統計或者別的等。在 Node...
閱讀 3757·2021-11-24 09:39
閱讀 2953·2021-11-16 11:49
閱讀 2076·2019-08-30 13:54
閱讀 1105·2019-08-30 13:03
閱讀 1092·2019-08-30 11:10
閱讀 718·2019-08-29 17:10
閱讀 1248·2019-08-29 15:04
閱讀 1212·2019-08-29 13:02