Node.js應用中可能會發生多種類型的錯誤。如:當出現語法錯誤
或運行時錯誤時
,會觸發JavaScript錯誤;當試圖試訪問一個不存在或沒有訪問的文件時,會觸發系統錯誤
;除JavaScript錯誤
和系統錯誤
外,用戶還能夠自定義錯誤。理解Node.js中錯誤類型,能夠幫咱們更好的進行錯誤處理和異常捕獲。html
Node.js是一個JavaScript運行時平臺,其應用發生錯誤都是一個Error
實例或Error
子類的實例。node
在Node.js應用中,可能發生的錯誤有如下4類:npm
標準JavaScript錯誤,如:編程
<EvalError> : 當調用 eval() 失敗時拋出服務器
<SyntaxError> : 當使用非法JavaScript語法時拋出框架
<RangeError> : 當一個值不在指定範圍內時拋出dom
<ReferenceError> : 當使用未定義的變量時拋出異步
<TypeError> : 當傳遞錯誤的類型參數拋出異步編程
<URIError> : 當一個全局的URI函數被錯誤使用時拋出函數
系統錯誤,這類錯誤由底層系統觸發,如試圖打開不存在的文件,試圖經過已關閉的Soket發送數據時等
自定義錯誤,這類錯誤在應用代碼中由用戶指定觸發
斷言錯誤,這類錯誤在代碼違反合法邏輯時,由Node.js的assert模塊觸發
標準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
,在異常捕獲後,能夠經過如下兩個屬性來訪問這些信息:
error.message - 錯誤信息
error.stack - 錯誤堆棧追蹤信息
除Error
實例自己的屬性外,還可自定義一些錯誤屬性。如,自定義一個表示狀態的屬性status
:
var error = new Error('您訪問的頁面不存在'); error.status = 404;
系統錯誤是對JavaScript錯誤Error
對象的一個擴展,它們表示程序可以處理的操做錯誤,這些錯誤信息都是在系統級別生成的。系統錯誤實例中除Error
實例中的屬性外,還包括如下幾個屬性:
error.syscall - 一個表示失敗的系統調用信息的字符串
error.errno - 一個整數的錯誤碼
error.code - 表示錯誤字符串,一般是大寫字母E
開頭
更多關係JavaScript錯誤與系統錯誤的介紹:Node.js 中的JavaScript 錯誤與系統錯誤
Node.js採用事件驅動、異步編程基制,這意味着try / catc
h捕獲不到異步處理髮生的錯誤。針對這種狀況,咱們能夠使用如下兩種方式來捕獲或傳遞錯誤:
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中異常處理的介紹,請參考如下文章: