Error Error是JavaScript語言中的一個標準的內置對象,專門用於處理JS開發中的運行時錯誤。 當我們的JS代碼在運行過程中發生錯誤的話,就會拋出Error對象,整個程式將會中斷在錯誤發生的代碼處,不再繼續執行,這也是錯誤類型必須重視的原因:它會導致頁面無法顯示或者功能失效。 Erro ...
Error
Error是JavaScript語言中的一個標準的內置對象,專門用於處理JS開發中的運行時錯誤。
當我們的JS代碼在運行過程中發生錯誤的話,就會拋出Error對象,整個程式將會中斷在錯誤發生的代碼處,不再繼續執行,這也是錯誤類型必須重視的原因:它會導致頁面無法顯示或者功能失效。
Error是JavaScript中最原始的錯誤對象,作為各種異常的基礎對象,還有多個衍生的具體的錯誤類型,這些錯誤對象類型在nodejs中也可應用。
Error作為內置對象,它本身數據類型是 function
,但被引用時它的數據類型是 object
,和 Object
、Array
類似,使用 typeof
進行判斷如下:
typeof Error // 'function'
typeof Error() // 'object'
typeof new Error() // 'object'
關於typeof的詳細知識,可參考本博前文一文搞懂js中的typeof用法
Error語法
下麵介紹下Error對象基本的語法知識。
Error對象既可以當作構造函數使用,也可以當作方法,一般有兩個可選參數:
new Error(message, options)
Error(message, options)
可選參數說明如下:
- message:錯誤信息描述
- options:屬性對象
- cause:指定錯誤的具體原因
Error屬性和方法
Error實例必然包含 message
屬性,除此外一般還提供 name
和 stack
屬性,而 cause
屬性則根據定義來確定。
- message:錯誤信息描述
- name:錯誤的類型名字
- stack:錯誤的堆棧軌跡,用於堆棧追蹤
- cause:當前錯誤被拋出的具體原因
下麵通過一個示例,看下具體的屬性信息:
const err = new Error('發生錯誤!', { cause: '333' })
console.log(err)
// Error: 發生錯誤!
// at <anonymous>:1:13
console.log(err.message)
// '發生錯誤!'
console.log(err.cause)
// '333'
console.log(err.stack)
// Error: 發生錯誤!
// at <anonymous>:1:13
如上代碼,定義了一個錯誤對象,並賦予兩個參數,在控制台輸出,可以看到該錯誤對象具體的屬性信息。
需要註意的是,只有定義了cause屬性的Error實例,才有該屬性,否則cause屬性不存在,如下所示:
const err2 = new Error('發生錯誤!')
console.log(err2.cause)
// undefined
err2.cause的輸出為undefined,因為構造函數並沒有定義該屬性。
Error對象沒有自己特有的實例方法,只有繼承自Object對象的,這裡略過。
六種常見錯誤類型
Error對象衍生有六種常見的錯誤類型,屬於Error的派生類,屬性和方法也都繼承自Error,下麵一一介紹下這六種類型。
SyntaxError
SyntaxError 語法錯誤,表示JS代碼發生的語法上的錯誤,包括各種不符合語法規範、書寫錯漏等情況。
如下變數名錯誤:
const 11 = 8
// Uncaught SyntaxError: Unexpected number
錯誤的代碼語法:
Error(+)
// Uncaught SyntaxError: Unexpected token ')'
SyntaxError語法錯誤無法被捕獲,因為語法錯誤不會被執行,直接拋出錯誤,所幸的是,現在的IDE工具和各種插件,已可規避大部分的語法錯誤。
TypeError
TypeError 類型錯誤,當代碼中的變數參數等類型不對時,就會發生該類型錯誤。
比如,把屬性當方法使用:
window.location()
// Uncaught TypeError: window.location is not a function
// at <anonymous>:1:8
錯誤的構造函數使用:
new null()
// Uncaught TypeError: null is not a constructor
// at <anonymous>:1:1
ReferenceError
ReferenceError 引用錯誤,當引用一個並不存在的變數時會發生的錯誤。
如直接在瀏覽器控制列印:
a
// Uncaught ReferenceError: a is not defined
// at <anonymous>:1:1
cons.log('')
// Uncaught ReferenceError: cons is not defined
// at <anonymous>:1:1
錯誤的值分配,給 null
賦值:
null = 1
// Uncaught SyntaxError: Invalid left-hand side in assignment
RangeError
RangeError 取值範圍錯誤,當給某個對象指定一個不在取值範圍內的特定值時發生的錯誤。
如給Array對象傳入不合法的長度參數
Array(-1)
Array(Infinity)
// Uncaught RangeError: Invalid array length
// at <anonymous>:1:1
數字類型方法的使用:
5..toFixed(200)
// Uncaught RangeError: toFixed() digits argument must be between 0 and 100
// at Number.toFixed (<anonymous>)
// at <anonymous>:1:4
toFixed()
參數取值範圍在0到100之間,超過則會報錯。
URIError
URIError 當使用URI相關方法處理數據時,當這些方法的參數不正確時導致的一些錯誤。
主要常見於URI的解碼等方法decodeURI()、decodeURIComponent()等。
decodeURI('%')
decodeURIComponent('%')
// Uncaught URIError: URI malformed
// at decodeURIComponent (<anonymous>)
// at <anonymous>:1:1
EvalError
EvalError 當在使用eval函數時,發生的錯誤。eval不被推薦使用,該錯誤類型一般很少見,處於半廢棄狀態,為了相容考慮才存在。
自定義錯誤類型
除了JavaScript自帶的常見錯誤類型以外,我們還可以自定義特殊的錯誤類型。
處理起來也很簡單,使用繼承Error對象的方式即可。
class CharError extends Error {
constructor(message = '字元錯誤') {
super(message)
this.name = 'CharError'
}
}
以上代碼使用es6的類繼承方式,自定義一個錯誤類型繼承Error對象,後續就可以使用新的 CharError
類型。
const ce = new CharError()
console.log(ce)
// CharError: 字元錯誤
// at error.html:26:16
如上,與JavaScript內置錯誤類型使用方式一致。