首頁 > 軟體

JavaScript錯誤處理機制全面分析講解

2022-10-16 14:00:31

1. Error 範例

JavaScript在執行錯誤時會丟擲一個錯誤,JS提供了Error建構函式,所有丟擲的錯誤都是這個建構函式的範例

const err = new Error('程式碼出錯了');
err.message; // 程式碼出錯了

上面的Error接受了一個message引數,Error建構函式還有另外兩個引數name和stack

  • message 錯誤提示資訊
  • name 錯誤名稱
  • stack 錯誤的呼叫棧
const err = new Error('程式碼出錯了');
err.name; // 'Error'
err.stack; //'Error: 出錯了n    at <anonymous>:1:5'

2. 原生錯誤型別

除了基礎的Error錯誤型別,JavaScript還內建了六種原始的錯誤型別

  • ReferenceError 參照錯誤
  • SyntaxError 語法錯誤
  • TypeError 型別錯誤
  • RangeError 範圍錯誤
  • URIError URI方法執行錯誤
  • EvalError eval函數執行錯誤

2.1 ReferenceError

使用一個不存在的變數時會丟擲Reference Error

test; 
//Uncaught ReferenceError: assd is not defined at <anonymous>:1:1

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

console.log() = 1
// Uncaught ReferenceError: Invalid left-hand side in assignment

2.2 SyntaxError

當JS解析程式碼發生錯誤時會丟擲SyntaxError錯誤

const 1a;
Uncaught SyntaxError: Invalid or unexpected token
5 = 6;
Uncaught SyntaxError: Invalid left-hand side in assignment

2.3 TypeError

放變數或者引數不是預期型別的時候會出現TypeError錯誤,比如對非函數型別使用new,或者對非函數型別使用圓括號運算

let a; 
a(); 
//VM7449:1 Uncaught TypeError: b is not a function at <anonymous>:1:1

2.4 RangeError

當數值超出預期範圍的時候會出現RangeError,主要情況有幾種,一是陣列長度為負數,二是Number物件的方法接收的引數超出範圍,以及函數堆疊超出最大值

const arr = new Array(-5);
//VM7833:1 Uncaught RangeError: Invalid array lengthat <anonymous>:1:13
function foo(){
  foo();
};
foo();
//Uncaught RangeError: Maximum call stack size exceeded

2.5 URIError

URI方法執行錯誤時會出現URIError錯誤,例如URIError接收非預期的引數

decodeURI('%');
//VM8142:1 Uncaught URIError: URI malformedat decodeURI (<anonymous>)at <anonymous>:1:1

2.6 evalError

eval函數執行錯誤時會丟擲EvalError,該錯誤型別以及不再被使用了,知識為了保證與以前程式碼相容才保留

3. 自定義錯誤型別

除了JS提供的7種原生的錯誤型別,還可以通過繼承Error自定義錯誤型別

funtion CustomError(message){
  this.message = message;
  this.name = 'CustomError';
};
CustomError.prototype = new Error();
CustomError.prototype.construct = CustomError;
throw new CustomError('這是一個自定義錯誤');
//CustomError {message: '這是一個自定義錯誤', name: 'CustomError'};

4. throw

在使用thorw丟擲錯誤的時候,程式碼執行會在在throw處終止,thorw以下的程式碼將不再執行

throw new Error('出錯了');
console.log('該行程式碼不會執行');

實際上throw不僅能丟擲Error範例,還能丟擲任意型別的資料,對javaScript引擎來說只要遇上throw程式碼就停止執行

thorw '23';
console.log('該行程式碼不會執行');
throw true;
throw {};
throw [];
throw 20;

throw方法有兩種寫法,可以加上圓括號和省略圓括號

throw new Error('出錯了');
throw (new Error('出錯了'));

5. try…catch

使用throw的時候會阻礙後續程式碼的執行,使用費try…catch包裹throw語句就不會影響後續程式碼的執行了,catch用於錯誤的捕獲,程式碼發生錯誤的時候執行。

    try {
      throw new Error('出錯了');
    } catch (e) {
      console.error(e)
    };
    console.log('後續程式碼繼續執行'); //後續程式碼繼續執行

6. finally

不管是否發生錯誤finally語句都會執行

    try {
      throw new Error('出錯了');
    } catch (e) {
      console.log('catch')
    }finally{
       console.log('finally');
    }

總結

JS內建了六種內錯誤型別: SyntaxError、ReferenceError、TypeError、RangeError、URIError、EvalError

到此這篇關於JavaScript錯誤處理機制全面分析講解的文章就介紹到這了,更多相關JS錯誤處理機制內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com