1. 程式人生 > >程式報錯的型別

程式報錯的型別

一般我們執行程式碼的時候,在控制檯報錯會相應的顯示你錯誤的行數,找到那一行,查詢你相應的錯誤

 

 

1、xxx is not defined

 

xxx 沒有定義  

 

 

2、xxx is not a function

 

xxx 不是一個函式

xxx此時是undefined

 

3、Cannot read property 'xxx' of undefined

 

不能讀取undefined的xxx屬性

 

xxx前面的變數是undefined

 

 

4、Cannot set property 'xxx' of null

 

不能給null設定xxx屬性

 

xxx前面的變數是null

 

5、Invalid or unexpected token

 

標點符號可能是中文

 

6、Unexpected token a in JSON at position 0

 

使用JSON.parse進行解析json字串時,解析的內容不合法

 

7、XMLHttpRequest cannot load http://XXXXXX. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://XXXXXX' is therefore not allowed access.

 

使用ajax請求資料時,產生跨域了

 

8、Illegal break statement

 

出現了非法語句

 

 

9、SyntaxError(語法錯誤)

 

SyntaxError是解析程式碼時發生的語法錯誤

// 變數名錯誤

var 1a; 

// 缺少括號

console.log ('hello';

 

10、ReferenceErro(引用錯誤)

 

ReferenceError是引用一個不存在的變數時發生的錯誤。

 

unknownVariable

// ReferenceError: unknownVariable is not defined

 

另一種觸發場景是,將一個值分配給無法分配的物件,比如對函式的執行結果或者this賦值。

 

console.log() = 1

// ReferenceError: Invalid left-hand side in assignment this = 1

// ReferenceError: Invalid left-hand side in assignment

 

上面程式碼對函式console.log的執行結果和this賦值,結果都引發了ReferenceError錯誤

 

11、RangeError(範圍錯誤)

 

RangeError是當一個值超出有效範圍時發生的錯誤。主要有幾種情況,一是陣列長度為負數,二是Number物件的方法引數超出範圍,以及函式堆疊超過最大值。

 

new Array(-1)

// RangeError: Invalid array length

(1234).toExponential(21)

// RangeError: toExponential() argument must be between 0 and 20

 

12、TypeError(型別錯誤)

 

TypeError是變數或引數不是預期型別時發生的錯誤。比如,對字串、布林值、數值等原始型別的值使用new命令,就會丟擲這種錯誤,因為new命令的引數應該是一個建構函式。

 

new 123

//TypeError: number is not a func var obj = {}; obj.unknownMethod()

// TypeError: undefined is not a function

 

上面程式碼的第二種情況,呼叫物件不存在的方法,會丟擲TypeError錯誤。

 

13、URIError(URI錯誤)

 

URIError是URI相關函式的引數不正確時丟擲的錯誤,主要涉及encodeURI()、decodeURI()、encodeURIComponent()、decodeURIComponent()、escape()和unescape()這六個函式。

 

decodeURI('%2')

// URIError: URI malformed

 

14、EvalError(eval錯誤)

 

eval函式沒有被正確執行時,會丟擲EvalError錯誤。該錯誤型別已經不再在ES5中出現了,只是為了保證與以前程式碼相容,才繼續保留。

 

以上這6種派生錯誤,連同原始的Error物件,都是建構函式。開發者可以使用它們,人為生成錯誤物件的例項。

 

new Error("出錯了!");

new RangeError("出錯了,變數超出有效範圍!");

new TypeError("出錯了,變數型別無效!");

 

上面程式碼表示新建錯誤物件的例項,實質就是手動丟擲錯誤。可以看到,錯誤物件的建構函式接受一個引數,代表錯誤提示資訊(message)。

 

15、錯誤舉例

 

  • 找不到引入的.js檔案

 

引用的.js檔案找不到,chrome報錯資訊如下:

GET file:///D:/JavaBooks/js/jquery%20validation/src-gzh/jquery.validate-1.7.src net::ERR_FILE_NOT_FOUND

 

可能原因:.js檔名字拼寫錯誤(比如,少了檔案字尾.js)

 

  • js函式缺少括號),函式體缺少大括號}

如果函式缺少括號或者函式體缺少括號,瀏覽器debug時都會提示報錯資訊。這裡分2種情況:

1、一般報錯資訊都在報在錯誤的地方,這種情況比較好說。

2、但是有的時候會報在其他的地方,這個時候要明白的是,報錯資訊缺少括號這一點是確定無疑的,現在就是要定位到具體是哪一行報錯。

 

例如

報錯函式/函式體缺少括號,報錯的地方不是函式/函式體的末尾,而是報在呼叫該函式的地方。

 

  • css程式碼使用了//註釋,導致有的div內容出不來,然後也不報錯

css註釋,只能使用/* 註釋內容 */,而不能使用雙斜槓//。

 

  • 定義了多個同名的變數

瀏覽器會報錯。

 

  • 文件未載入完畢,就開始執行js程式碼導致的錯誤

文件/DOM未載入完畢,就開始執行js程式碼。

 

比如,js程式碼寫在html程式碼的前面,而且document.getElementById('traffic')這樣來訪問DOM(即文件的元素),那麼這個時候就會報TypeError: a is null(火狐瀏覽器,注:a變數沒用,只會起誤導作用)或者Uncaught TypeError: Cannot read property 'click2' of null(谷歌瀏覽器)。

 

  • js 物件的函式未定義

瀏覽器報錯,說物件的函式未定義,這個時候可以肯定的一點是,當前這個物件是沒有這個函式的。

 

比如,高德地圖物件函式未定義,是因為地圖物件被2.5維地圖物件覆蓋了。

出現這種bug時,問題在函式,往往是因為物件被重複定義,或者被重新賦值了。