摘要:總結(jié)一下以便有更清晰的認(rèn)知。隱藏的異常說(shuō)明隱藏的異常不是由觸發(fā)而是在運(yùn)行時(shí)發(fā)生的例如上面常見(jiàn)的這種異常可以使用等工具檢查出來(lái)。使用域的好處是可以把各式異常放到一個(gè)域的異常處理函數(shù)中且不影響其他的域。在非阻塞式中一般都是用集中處理異常。
引言
異常分類 顯式異常對(duì)錯(cuò)誤進(jìn)行分類,理解錯(cuò)誤是如何產(chǎn)生的,以及錯(cuò)誤發(fā)生后怎么定位解決,這在構(gòu)建一個(gè)穩(wěn)定運(yùn)行的程序過(guò)程中會(huì)經(jīng)常遇到。總結(jié)一下,以便有更清晰的認(rèn)知。
function validateName(name) { if(!name){ throw new Error("name is required"); } } try { validateName(); }catch (err){ console.log(err.message,err.stack); }
說(shuō)明 有以下幾點(diǎn)需要注意
一般用于同步方法,或者異步執(zhí)行前,否則無(wú)法捕獲異常,process直接exit。
拋出的錯(cuò)誤一般都是繼承于Error。使用簡(jiǎn)單的字符串例如(throw "error happen")無(wú)法獲得調(diào)試堆棧信息。
不要在內(nèi)置的node方法中拋出異常,沒(méi)有意義,因?yàn)樵趎ode中回調(diào)函數(shù)第一個(gè)參數(shù)就是錯(cuò)誤對(duì)象,可以直接處理。
隱藏的異常function getName() { return name; } getName();
說(shuō)明 隱藏的異常不是由throw觸發(fā),而是在運(yùn)行時(shí)發(fā)生的,例如上面常見(jiàn)的ReferenceError,這種異常可以使用eslint等工具檢查出來(lái)。
no-undef:error錯(cuò)誤事件
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"));
說(shuō)明 當(dāng)EventEmitter實(shí)例發(fā)生錯(cuò)誤時(shí),會(huì)觸發(fā)error事件,如果沒(méi)有error事件的監(jiān)聽(tīng)器,默認(rèn)會(huì)打印堆棧,然后退出程序。如果實(shí)例比較多,想要統(tǒng)一管理,可以使用domain模塊管理。例如下面的示例,集中處理connection時(shí)發(fā)生的異常。
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); });
使用域的好處是,可以把各式異常放到一個(gè)域的異常處理函數(shù)中,且不影響其他的域。在非阻塞式api中,一般都是用domain集中處理異常。想要全局處理,可以按照下面的方式來(lái)個(gè)統(tǒng)一處理,不推薦。
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是最后一道防線,比較好的做法是記錄錯(cuò)誤信息,然后重啟。
錯(cuò)誤參數(shù)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); })
說(shuō)明 上述示例中,如果忽略readFile返回的錯(cuò)誤,有可能無(wú)法獲取buf而拋出異常,所以錯(cuò)誤參數(shù)還是需要處理一下。
問(wèn)題debug比較low的方法就是console或者打日志,這個(gè)在開(kāi)發(fā)中不用,打日志一般是用來(lái)記錄查看線上問(wèn)題;開(kāi)發(fā)中一般都是斷點(diǎn)調(diào)試,重點(diǎn)分析下。
調(diào)試方式一Node.js 6.3以下,使用老的方式話,node-inspect作為模塊需要多帶帶安裝,其作用通過(guò)websocket的方式充當(dāng)一個(gè)連接通道,負(fù)責(zé)dev tool和node中運(yùn)行程序產(chǎn)生的debug信息進(jìn)行通信。
node-inspector & ;node-debug app.js
出現(xiàn)下圖所示就代表成功了。
node6.3+中, node --inspect app.js ,使用前開(kāi)啟chrome的Node debugging選項(xiàng),出現(xiàn)下面效果標(biāo)識(shí)就成功了。
說(shuō)明 上述兩種調(diào)試方式,我很少用,一般我都是用webstrome來(lái)調(diào)試,通過(guò)調(diào)整Node Interpreter的版本來(lái)使用相應(yīng)的調(diào)試方式,原理和上面是一樣的,只是調(diào)試形式上變化了下。
7以上我通常都是用 --inspect的方式,否則會(huì)提示你"node --debug is deprecated",但是用老方式也沒(méi)什么問(wèn)題。區(qū)別其實(shí)就是獲取debug信息的通信協(xié)議方式不同,新的方式使用的是Chrome Debugging Protocol,而老的是 V8 Debugging Protoco。
總結(jié)上面我只是總結(jié)了通用的異常情況,其實(shí)還有一些特殊的使用方式,例如throw在generator當(dāng)中的使用,以及promise中可以直接拋出異常,都不是我上面所說(shuō)的一般情況,不在列舉,
因?yàn)槿罾蠋熽P(guān)于這兩個(gè)api的論述很詳細(xì),此處不在贅述。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/83243.html
摘要:但如果忽視異常輕則影響功能運(yùn)行,重則導(dǎo)致系統(tǒng)崩潰,造成經(jīng)濟(jì)損失。異常處理捕獲異常捕獲關(guān)鍵字與一致,都是使用。語(yǔ)句塊表示無(wú)論是否發(fā)生異常,語(yǔ)句塊代碼一定會(huì)被執(zhí)行。 不少前端工程師看到這個(gè)標(biāo)題可能會(huì)產(chǎn)生質(zhì)問(wèn): 我js用得好好的,能后端能APP,為什么還要學(xué)習(xí)Python? 至少有下面兩個(gè)理由: 學(xué)習(xí)曲線。ES6之后的JavaScript(TypeScript)的在語(yǔ)法上和Python有很...
摘要:加載百度地圖后報(bào)錯(cuò)的,我們?cè)偌虞d一遍你的秘鑰你的秘鑰為當(dāng)前時(shí)間戳獲取方法 一、環(huán)境搭建 1、安裝node.js在計(jì)算機(jī)中https://nodejs.org/en/download/ (此為node.js官方下載地址)安裝完成后打開(kāi)cmd命令提示符 node -v //查詢node版本號(hào) npm -v //查詢npm版本號(hào) 2、如果npm使用網(wǎng)速跟不上...
摘要:一中的對(duì)象包含了錯(cuò)誤的具體信息,包括錯(cuò)誤堆棧等。不源碼了,特別簡(jiǎn)單,自己去一下。 一. Error ????JS 中的 Error 對(duì)象. 包含了錯(cuò)誤的具體信息,包括 name、message、錯(cuò)誤堆棧 stack 等。可以以 new Error 方式創(chuàng)建實(shí)例拋出,或調(diào)用 Error.captureStackTrace 為已有對(duì)象添加 stack 錯(cuò)誤堆棧信息 而后拋出showImg(...
摘要:日志規(guī)范一般前端開(kāi)發(fā)同學(xué),對(duì)日志其實(shí)不太敏感,畢竟前端大多數(shù)情況下,不太關(guān)心日志。本文主要梳理了目前我們團(tuán)隊(duì)在開(kāi)發(fā)中日志方面存在的問(wèn)題,以及通過(guò)統(tǒng)一日志規(guī)范,希望達(dá)到什么樣的效果。日志格式字段日志格式統(tǒng)一采用,便于解析處理。nodejs 日志規(guī)范 一般前端開(kāi)發(fā)同學(xué),對(duì)日志其實(shí)不太敏感,畢竟前端大多數(shù)情況下,不太關(guān)心日志。即使有,也可能調(diào)用一些第三方的統(tǒng)計(jì),比如百度統(tǒng)計(jì)或者別的等。在 Node...
閱讀 3844·2021-11-24 09:39
閱讀 3101·2021-11-16 11:49
閱讀 2160·2019-08-30 13:54
閱讀 1196·2019-08-30 13:03
閱讀 1177·2019-08-30 11:10
閱讀 863·2019-08-29 17:10
閱讀 1332·2019-08-29 15:04
閱讀 1292·2019-08-29 13:02