總結(jié)Node.js中的一些錯(cuò)誤類型
前言
Node.js應(yīng)用中可能會(huì)發(fā)生多種類型的錯(cuò)誤。如:當(dāng)出現(xiàn)語法錯(cuò)誤或運(yùn)行時(shí)錯(cuò)誤時(shí),會(huì)觸發(fā)JavaScript錯(cuò)誤;當(dāng)試圖試訪問一個(gè)不存在或沒有訪問的文件時(shí),會(huì)觸發(fā)系統(tǒng)錯(cuò)誤;除JavaScript錯(cuò)誤和系統(tǒng)錯(cuò)誤錯(cuò)誤外,用戶還可以自定義錯(cuò)誤。
1. 錯(cuò)誤分類
Node.js是一個(gè)JavaScript運(yùn)行時(shí)平臺(tái),其應(yīng)用發(fā)生錯(cuò)誤都是一個(gè)Error
實(shí)例或Error
子類的實(shí)例。
在Node.js應(yīng)用中,可能發(fā)生的錯(cuò)誤有以下4類:
1、標(biāo)準(zhǔn)JavaScript錯(cuò)誤,如:
<EvalError>
: 當(dāng)調(diào)用 eval()
失敗時(shí)拋出
<SyntaxError>
: 當(dāng)使用非法JavaScript語法時(shí)拋出
<RangeError>
: 當(dāng)一個(gè)值不在指定范圍內(nèi)時(shí)拋出
<ReferenceError>
: 當(dāng)使用未定義的變量時(shí)拋出
<TypeError>
: 當(dāng)傳遞錯(cuò)誤的類型參數(shù)拋出
<URIError>
: 當(dāng)一個(gè)全局的URI函數(shù)被錯(cuò)誤使用時(shí)拋出
2、系統(tǒng)錯(cuò)誤,這類錯(cuò)誤由底層系統(tǒng)觸發(fā),如試圖打開不存在的文件,試圖通過已關(guān)閉的Soket發(fā)送數(shù)據(jù)時(shí)等
3、自定義錯(cuò)誤,這類錯(cuò)誤在應(yīng)用代碼中由用戶指定觸發(fā)
4、斷言錯(cuò)誤,這類錯(cuò)誤在代碼違反合法邏輯時(shí),由Node.js的assert
模塊觸發(fā)
2. JavaScript錯(cuò)誤與系統(tǒng)錯(cuò)誤
2.1 JavaScript錯(cuò)誤及自定義錯(cuò)誤
標(biāo)準(zhǔn)JavaScript錯(cuò)誤是由JavaScript語言提供的,表示語法錯(cuò)誤或使用不當(dāng)?shù)腁PI。所有錯(cuò)誤都是一個(gè)Error
類實(shí)例,而標(biāo)準(zhǔn)JavaScript錯(cuò)誤會(huì)由語言本身在發(fā)生錯(cuò)誤時(shí)構(gòu)建。
自定義錯(cuò)誤時(shí),使用構(gòu)造函數(shù)創(chuàng)建實(shí)例即可:
> throw new Error('出錯(cuò)了,這是錯(cuò)誤信息'); Error: 出錯(cuò)了,這是錯(cuò)誤信息 at repl:1:7 at REPLServer.defaultEval (repl.js:248:27) at bound (domain.js:280:14) at REPLServer.runBound [as eval] (domain.js:293:12) at REPLServer.<anonymous> (repl.js:412:12) at emitOne (events.js:82:20) at REPLServer.emit (events.js:169:7) at REPLServer.Interface._onLine (readline.js:210:10) at REPLServer.Interface._line (readline.js:549:8) at REPLServer.Interface._ttyWrite (readline.js:826:14)
如上,我們自定義了一個(gè)錯(cuò)誤,并使用throw關(guān)鍵字將錯(cuò)誤拋出。在這個(gè)錯(cuò)誤對(duì)象中,包括錯(cuò)誤信息message
和錯(cuò)誤的堆棧信息stack
,在異常捕獲后,可以通過以下兩個(gè)屬性來訪問這些信息:
1、error.message
- 錯(cuò)誤信息
2、error.stack
- 錯(cuò)誤堆棧追蹤信息
除Error實(shí)例本身的屬性外,還可自定義一些錯(cuò)誤屬性。如,自定義一個(gè)表示狀態(tài)的屬性status:
var error = new Error('您訪問的頁面不存在'); error.status = 404;
2.2 系統(tǒng)錯(cuò)誤
系統(tǒng)錯(cuò)誤是對(duì)JavaScript錯(cuò)誤Error
對(duì)象的一個(gè)擴(kuò)展,它們表示程序能夠處理的操作錯(cuò)誤,這些錯(cuò)誤信息都是在系統(tǒng)級(jí)別生成的。系統(tǒng)錯(cuò)誤實(shí)例中除Error
實(shí)例中的屬性外,還包括以下幾個(gè)屬性:
1、error.syscall
- 一個(gè)表示失敗的系統(tǒng)調(diào)用信息的字符串
2、error.errno
- 一個(gè)整數(shù)的錯(cuò)誤碼
3、error.code
- 表示錯(cuò)誤字符串,通常是大寫字母E開頭
3. 異常捕獲
Node.js采用事件驅(qū)動(dòng)、異步編程基制,這意味著try / catch
捕獲不到異步處理發(fā)生的錯(cuò)誤。針對(duì)這種情況,我們可以使用以下兩種方式來捕獲或傳遞錯(cuò)誤:
Node.js式回調(diào)函數(shù)中的異常捕獲
Node.js有很多異步API,這些API通過回調(diào)函數(shù)callback進(jìn)行后續(xù)處理。如果發(fā)生錯(cuò)誤,通常會(huì)在callback
函數(shù)的第一個(gè)參數(shù)中包含一個(gè)Error
對(duì)象;如果未發(fā)生錯(cuò)誤,第一參數(shù)將是null
。如:
const fs = require('fs'); fs.readFile('一個(gè)不存在的文件', (err, data) => { if (err) { console.error('讀取文件錯(cuò)誤', err); return; } // 其它處理 });
基于事件的錯(cuò)誤處理
如果對(duì)象是一個(gè)EventEmitter
,可以通過對(duì)象 的'error'
事件捕獲并處理錯(cuò)誤:
const net = require('net'); const connection = net.connect('localhost'); // 為stream添加一個(gè) 'error' 事件處理器: connection.on('error', (err) => { // 如果連接被服務(wù)器重置或連接不到指定的服務(wù)器 // 或其它連接錯(cuò)誤時(shí),錯(cuò)誤會(huì)被傳遞到這里 console.error(err); }); connection.pipe(process.stdout);
總結(jié)
以上就是關(guān)于Node.js中的一些錯(cuò)誤類型的總結(jié),能夠理解Node.js中錯(cuò)誤類型,就可以幫我們更好的進(jìn)行錯(cuò)誤處理和異常捕獲。希望本文的內(nèi)容對(duì)大家能有所幫助。
- 詳解JavaScript中的六種錯(cuò)誤類型
- Node.js下自定義錯(cuò)誤類型詳解
- JS常見錯(cuò)誤(Error)及處理方案詳解
- 詳解javascript中的Error對(duì)象
- JS使用onerror捕獲異常示例
- JavaScript通過使用onerror設(shè)置默認(rèn)圖像顯示代替alt
- IE8 下的Js錯(cuò)誤HTML Parsing Error...
- javascript Error 對(duì)象 錯(cuò)誤處理
- javascript window.onerror事件學(xué)習(xí)新收獲
- 7個(gè)你應(yīng)該知道的JS原生錯(cuò)誤類型
相關(guān)文章
詳解如何使用Node.js實(shí)現(xiàn)熱重載頁面
這篇文章主要介紹了詳解如何使用Node.js實(shí)現(xiàn)熱重載頁面,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05Nodejs中Express 常用中間件 body-parser 實(shí)現(xiàn)解析
這篇文章主要介紹了Nodejs中Express 常用中間件 body-parser 實(shí)現(xiàn)解析,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05node打造微信個(gè)人號(hào)機(jī)器人的方法示例
這篇文章主要介紹了node打造微信個(gè)人號(hào)機(jī)器人的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04node.js+postman+mongodb搭建測試注冊(cè)接口的實(shí)現(xiàn)
本文主要介紹了node.js+postman+mongodb搭建測試注冊(cè)接口的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06websocket+node.js實(shí)現(xiàn)實(shí)時(shí)聊天系統(tǒng)問題咨詢
最近新學(xué)習(xí)websocket,做了一個(gè)實(shí)時(shí)聊天。用Node.js搭建的服務(wù):serevr.js. 兩個(gè)相互通信頁面:client.html 和server.html 但是就是有很多問題,下面通過本文給大家分享下2017-05-05nodejs基于mssql模塊連接sqlserver數(shù)據(jù)庫的簡單封裝操作示例
這篇文章主要介紹了nodejs基于mssql模塊連接sqlserver數(shù)據(jù)庫的簡單封裝操作,結(jié)合實(shí)例形式分析了nodejs中mssql模塊的安裝與操作sqlserver數(shù)據(jù)庫相關(guān)使用技巧,需要的朋友可以參考下2018-01-01