前言
Node.js應用中可能會發生多種類型的錯誤。如:當出現語法錯誤或運行時錯誤時,會觸發JavaScript錯誤;當試圖試訪問一個不存在或沒有訪問的文件時,會觸發系統錯誤;除JavaScript錯誤和系統錯誤錯誤外,用戶還可以自定義錯誤。
1. 錯誤分類
Node.js是一個JavaScript運行時平台,其應用發生錯誤都是一個Error
實例或Error
子類的實例。
在Node.js應用中,可能發生的錯誤有以下4類:
1、標准JavaScript錯誤,如:
<EvalError>
: 當調用 eval()
失敗時拋出
<SyntaxError>
: 當使用非法JavaScript語法時拋出
<RangeError>
: 當一個值不在指定范圍內時拋出
<ReferenceError>
: 當使用未定義的變量時拋出
<TypeError>
: 當傳遞錯誤的類型參數拋出
<URIError>
: 當一個全局的URI函數被錯誤使用時拋出
2、系統錯誤,這類錯誤由底層系統觸發,如試圖打開不存在的文件,試圖通過已關閉的Soket發送數據時等
3、自定義錯誤,這類錯誤在應用代碼中由用戶指定觸發
4、斷言錯誤,這類錯誤在代碼違反合法邏輯時,由Node.js的assert
模塊觸發
2. JavaScript錯誤與系統錯誤
2.1 JavaScript錯誤及自定義錯誤
標准JavaScript錯誤是由JavaScript語言提供的,表示語法錯誤或使用不當的API。所有錯誤都是一個Error
類實例,而標准JavaScript錯誤會由語言本身在發生錯誤時構建。
自定義錯誤時,使用構造函數創建實例即可:
> throw new Error('出錯了,這是錯誤信息'); Error: 出錯了,這是錯誤信息 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)
如上,我們自定義了一個錯誤,並使用throw關鍵字將錯誤拋出。在這個錯誤對象中,包括錯誤信息message
和錯誤的堆棧信息stack
,在異常捕獲後,可以通過以下兩個屬性來訪問這些信息:
1、error.message
- 錯誤信息
2、error.stack
- 錯誤堆棧追蹤信息
除Error實例本身的屬性外,還可自定義一些錯誤屬性。如,自定義一個表示狀態的屬性status:
var error = new Error('您訪問的頁面不存在'); error.status = 404;
2.2 系統錯誤
系統錯誤是對JavaScript錯誤Error
對象的一個擴展,它們表示程序能夠處理的操作錯誤,這些錯誤信息都是在系統級別生成的。系統錯誤實例中除Error
實例中的屬性外,還包括以下幾個屬性:
1、error.syscall
- 一個表示失敗的系統調用信息的字符串
2、error.errno
- 一個整數的錯誤碼
3、error.code
- 表示錯誤字符串,通常是大寫字母E開頭
3. 異常捕獲
Node.js采用事件驅動、異步編程基制,這意味著try / catch
捕獲不到異步處理發生的錯誤。針對這種情況,我們可以使用以下兩種方式來捕獲或傳遞錯誤:
Node.js式回調函數中的異常捕獲
Node.js有很多異步API,這些API通過回調函數callback進行後續處理。如果發生錯誤,通常會在callback
函數的第一個參數中包含一個Error
對象;如果未發生錯誤,第一參數將是null
。如:
const fs = require('fs'); fs.readFile('一個不存在的文件', (err, data) => { if (err) { console.error('讀取文件錯誤', err); return; } // 其它處理 });
基於事件的錯誤處理
如果對象是一個EventEmitter
,可以通過對象 的'error'
事件捕獲並處理錯誤:
const net = require('net'); const connection = net.connect('localhost'); // 為stream添加一個 'error' 事件處理器: connection.on('error', (err) => { // 如果連接被服務器重置或連接不到指定的服務器 // 或其它連接錯誤時,錯誤會被傳遞到這裡 console.error(err); }); connection.pipe(process.stdout);
總結
以上就是關於Node.js中的一些錯誤類型的總結,能夠理解Node.js中錯誤類型,就可以幫我們更好的進行錯誤處理和異常捕獲。希望本文的內容對大家能有所幫助。