首頁  >  文章  >  web前端  >  js try ... catch語法結構有什麼用? try ... catch詳解

js try ... catch語法結構有什麼用? try ... catch詳解

青灯夜游
青灯夜游原創
2018-11-08 18:01:237488瀏覽

這篇文章帶給大家的內容是js try ... catch語法結構有什麼用? try ... catch詳解。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。

一、try ... catch的基本語法

#try..catch建構主要有兩個區塊:try{ }和catch(err){}:

try{
   //在这里运行代码
   //抛出错误
}
catch(err){
   //在这里处理错误
}

工作原理如下:

1、首先,執行程式碼try {...}。

2、如果沒有錯誤,則忽略catch(err){....},執行完try {...}後就跳過catch(err){....},直接執行下一語句。

3、如果發生錯誤,則try停止執行,開始執行catch(err){...}。 err變數(可以自己任意定義)包含一個錯誤對象,詳細說明了所發生的事情。

二、錯誤物件

發生錯誤時,JavaScript會產生一個包含有關它的詳細資訊的物件。然後將該物件作為參數傳遞給catch,例:

try {
  // ...
} catch(err) { // <-- "错误对象",“err”可以用可以用任意词代替
  // ...
}

對於所有內建錯誤,catch區塊內的錯誤物件有兩個主要屬性:

name

錯誤名稱,對於一個未定義的變數來「引用錯誤」。

message

有關錯誤詳細資訊的文字訊息。

大多數環境中還有其他非標準屬性。最廣泛使用和支援的一個是:

stack

目前呼叫堆疊:一個字串,其中包含導致錯誤的巢狀呼叫序列的資訊(目的是用於調試的)。

例如:

try {
  lalala; // 错误,变量未定义!
} catch(err) {
  alert(err.name); // 引用错误
  alert(err.message); // Lalala变量没有定义
  alert(err.stack); //引用错误:Lalala变量没有定义在…
  
  // 也可以作为整体显示错误
  // “name: message”:可以将错误转换为字符串
  alert(err); // ReferenceError: lalala is not defined
}

三、使用「try ... catch」

讓我們來探索一個真實的用例try..catch。

html程式碼:

<p>请输出一个 5 到 10 之间的数字:</p>
<input id="demo" type="text">
<button type="button" onclick="myFunction()">测试输入</button>
<p id="mess"></p>

js程式碼:

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");
		//抓住上面throw抛出的错误, 给p标签显示
		y.innerHTML = "错误:" + err + "。";
	}
}

運行後的效果圖:

js try ... catch語法結構有什麼用? try ... catch詳解js try ... catch語法結構有什麼用? try ... catch詳解

##四、try…catch…finally

#try…catch建構還有一個程式碼子句:finally。

如果它存在,它會在所有情況下運行:

1、在try之後,如果沒有錯誤,

2、在catch之後,如果有錯誤

擴充語法如下所示:

try {
   ... 尝试执行代码 ...
} catch(e) {
   ... 处理错误 ...
} finally {
   ... 始终执行 ...
}

#嘗試執行此程式碼:

try {
  alert( &#39;try&#39; );
  if (confirm(&#39;犯错误了?&#39;)) BAD_CODE();
} catch (e) {
  alert( &#39;catch&#39; );
} finally {
  alert( &#39;finally&#39; );
}

程式碼有兩種執行方式:

如果你對“犯錯了?”,回答“是(確定)”,那麼執行try -> catch -> finally。

如果你說“不(取消)”,那麼try -> finally。

finally表明當我們在try..catch之前開始做某事,並且想要在任何結果的情況下完成它時,就需要使用該子句。

例如,我們想要測量Fibonacci數函數所花費的時間fib(n)。當然,我們可以在運行之前開始測量並在之後完成測量。但是如果在函數呼叫期間出現錯誤怎麼辦?特別是,fib(n)下面的程式碼中的實作會傳回負數或非整數的錯誤。

finally無論如何,該條款都是完成測量的好地方。

這裡finally保證在兩種情況下都能正確測量時間- 如果成功執行fib並且出現錯誤:

let num = +prompt("输入正整数?", 35)

let diff, result;

function fib(n) {
	if(n < 0 || Math.trunc(n) != n) {
		throw new Error("不能是负的,且必须是整数。");
	}
	return n <= 1 ? n : fib(n - 1) + fib(n - 2);
}

let start = Date.now();

try {
	result = fib(num);
} catch(e) {
	result = 0;
} finally {
	diff = Date.now() - start;
}

alert(result || "发生错误");

alert(`执行时间 ${diff}ms`);

當我們輸入35時:


js try ... catch語法結構有什麼用? try ... catch詳解js try ... catch語法結構有什麼用? try ... catch詳解js try ... catch語法結構有什麼用? try ... catch詳解

當我們輸入-1:

js try ... catch語法結構有什麼用? try ... catch詳解js try ... catch語法結構有什麼用? try ... catch詳解js try ... catch語法結構有什麼用? try ... catch詳解

#兩次測量都正確完成。

總結:以上就是這篇文章的全部內容,希望能對大家的學習有所幫助,相關影片教學推薦:

JavaScript教學

以上是js try ... catch語法結構有什麼用? try ... catch詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn