1. 程式人生 > >javaScript複習(七)Error物件

javaScript複習(七)Error物件

Error:

1.錯誤/異常處理

   錯誤:導致程式無法繼續執行的異常狀態

    js中一旦發生錯誤,就會自動建立一個Error型別物件

2、js中的6種錯誤型別,當發生錯誤時,整個程式都無法執行

SyntaxError: 語法錯誤       Syntax:語法; 句法; 句法規則

    ReferenceError: 引用錯誤,找不到變數或物件   Reference:引用; 參照

    TypeError: 型別錯誤,錯誤的使用了物件中的方法時    Type:型別;

    RangeError: 範圍錯誤,引數超範圍     Range:範圍;

    EvalError: 呼叫eval函式時出錯

URLError: URL錯誤

 

①SyntaxError:語法錯誤

// 1.1 變數名不符合規範

var 1       // Uncaught SyntaxError: Unexpected number

var 1a       // Uncaught SyntaxError: Invalid or unexpected token

// 1.2 給關鍵字賦值

function = 5     // Uncaught SyntaxError: Unexpected token =

② Uncaught ReferenceError:引用錯誤

引用一個不存在的變數時發生的錯誤。將一個值分配給無法分配的物件,比如對函式的執行結果或者函式賦值。

// 2.1 引用了不存在的變數

a()       // Uncaught ReferenceError: a is not defined

console.log(b)     // Uncaught ReferenceError: b is not defined

// 2.2 給一個無法被賦值的物件賦值

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

③RangeError:範圍錯誤

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

// 3.1 陣列長度為負數

[].length = -5      // Uncaught RangeError: Invalid array length

// 3.2 Number物件的方法引數超出範圍

var num = new Number(12.34)

console.log(num.toFixed(-1))   // Uncaught RangeError: toFixed() digits argument must be between 0 and 20 at Number.toFixed

// 說明: toFixed方法的作用是將數字四捨五入為指定小數位數的數字,引數是小數點後的位數,範圍為0-20.

④ TypeError型別錯誤

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

// 4.1 呼叫不存在的方法

123()        // Uncaught TypeError: 123 is not a function

var o = {}

o.run()        // Uncaught TypeError: o.run is not a function

// 4.2 new關鍵字後接基本型別

var p = new 456      // Uncaught TypeError: 456 is not a constructor

⑤URIError,URL錯誤

主要是相關函式的引數不正確。

decodeURI("%")     // Uncaught URIError: URI malformed at decodeURI

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

⑥ EvalError eval()函式執行錯誤

在ES5以下的JavaScript中,當eval()函式沒有被正確執行時,會丟擲evalError錯誤。

例如下面的情況:

var myEval = eval;

myEval("alert('call eval')");

需要注意的是:ES5以上的JavaScript中已經不再丟擲該錯誤,但依然可以通過new關鍵字來自定義該型別的錯誤提示。

/*以上六個錯誤的案例轉自指令碼之家“詳解JavaScript中的六種錯誤型別”

作者:晌風,網址https://www.jb51.net/article/124210.htm#comments*/

 

3、錯誤處理:在程式發生錯誤時,可以保證程式不退出或正常退出

① 如何錯誤處理:

    語法:tryCatch塊:3部分

          try{

     正常程式碼段中,可能出錯的程式碼段

          }catch(err){//僅在發生錯誤時才執行

           //一旦發生錯誤err中就會自動存入Error物件

          1. 記錄/顯示錯誤的資訊

              2. 繼續向呼叫者丟擲異常

          }[finally{

             無論對錯,一定都會執行的程式碼段

             釋放資源

          }]

語句執行順序為:首先執行try語句塊中的程式碼,如果丟擲異常,接著執行catch語句塊中程式碼,如果沒有異常,catch語句塊中程式碼將會被忽略,但不管是否有異常,最後最會執行finally子句。try後面必須接著一個catch或者finally,也就是說JavaScript中的try-catch可以有3中組合形式。即try-catch、try-finally、try-catch-finally三種形式。

  

如果try塊中的任何程式碼發生了錯誤,就會立即退出程式碼執行過程,然後接著執行catch塊,此時,catch塊會接收到一個包含錯誤資訊的物件。與在其他語言中不同的是,即使你不想使用這個錯誤物件,也要給它起個名字。這個物件中包含的實際資訊會因瀏覽器而異,但共同的是有一個儲存著錯誤資訊的message屬性。

例:try {

    window.someNonexistentFunction(); //呼叫不存在的函式

} catch (error) {

    console.log(error.message);

}      //window.someNonexistentFunction is not a function

throw 語句允許我們建立自定義錯誤。

正確的技術術語是:建立或丟擲異常(exception)。

如果把 throw 與 try 和 catch 一起使用,那麼您能夠控制程式流,並生成自定義的錯誤訊息。

例:

<!DOCTYPE html>

<html>

<body>

 

<script>

function myFunction()

{

try

{

var x=document.getElementById("demo").value;

if(x=="")    throw "值為空";

if(isNaN(x))  throw "不是數字";

if(x>10)     throw "太大";

if(x<5)      throw "太小";

}

catch(err)

{

var y=document.getElementById("mess");

y.innerHTML="錯誤:" + err + "。";

}

}

</script>

 

<h1>Error</h1>

<p>請輸入 5 到 10 之間的數字:</p>

<input id="demo" type="text">

<button type="button" onclick="myFunction()">測試輸入值</button>

<p id="mess"></p>

 

</body>

</html>