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