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>