Node.js 中有哪些類型的錯誤

Node.js應用中可能會發生多種類型的錯誤。如:當出現語法錯誤運行時錯誤時,會觸發JavaScript錯誤;當試圖試訪問一個不存在或沒有訪問的文件時,會觸發系統錯誤;除JavaScript錯誤系統錯誤外,用戶還能夠自定義錯誤。理解Node.js中錯誤類型,能夠幫咱們更好的進行錯誤處理和異常捕獲。html

1. 錯誤分類

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模塊觸發

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,在異常捕獲後,能夠經過如下兩個屬性來訪問這些信息:

  • error.message - 錯誤信息

  • error.stack - 錯誤堆棧追蹤信息

Error實例自己的屬性外,還可自定義一些錯誤屬性。如,自定義一個表示狀態的屬性status

var error = new Error('您訪問的頁面不存在');
error.status = 404;

2.2 系統錯誤

系統錯誤是對JavaScript錯誤Error對象的一個擴展,它們表示程序可以處理的操做錯誤,這些錯誤信息都是在系統級別生成的。系統錯誤實例中除Error實例中的屬性外,還包括如下幾個屬性:

  • error.syscall - 一個表示失敗的系統調用信息的字符串

  • error.errno - 一個整數的錯誤碼

  • error.code - 表示錯誤字符串,一般是大寫字母E開頭

更多關係JavaScript錯誤與系統錯誤的介紹:Node.js 中的JavaScript 錯誤與系統錯誤

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中異常處理的介紹,請參考如下文章:

錯誤對象及錯誤的傳遞與捕獲
用domain模塊進行Node.js異步異常捕獲處理
Express 框架中對錯誤的統一處理

相關文章
相關標籤/搜索