JavaScript學習隨記——錯誤類型

錯誤類型: 執行代碼期間可能會發生的錯誤有多種類型。每種錯誤都有對應的錯誤類型,而當錯誤發生時,就會拋出相應類型的錯誤對象。

ECMA-262定義的7種錯誤類型

  1. Error: 是錯誤的基類型,其他錯誤類型都繼承該類型。Error 類型的錯誤很少見,如果有也是瀏覽器拋出的。
  2. EvalError: 使用eval() 函數而發生異常時被拋出。
  3. RangeError:在數值超過相應范圍是就會被拋出。
  4. ReferenceError: 在找不到對象的情況下,會發生 ReferenceEroor 。通常,在訪問不存在的變量時,就會發生這種錯誤。
  5. SyntaxError: 語法錯誤時會拋出此異常。
  6. TypeError: 在變量中保存著意外的類型時,或者訪問不存在的方法時,都會導致這種錯誤。錯誤的原因雖然多種多樣,但歸根結底還是由于在執行特定于類型的操作時,變量的類型并不符合要求所致。
  7. URIError: 在使用 encodeURI() 或 decodeURI(),而URI格式不正確,就會導致URIError錯誤。
@Example:
<script type="text/javascript" charset="utf-8">//1、 數值超過范圍時拋出 RangeErrorvar item1 = new Array(-10);						//拋出 RangeError: invalid array lengthvar item1 = new Array(Number.MAX_VALUE);		//拋出 RangeError: invalid array length//2、找不到對象時會拋出 ReferenceErrorvar obj = x;		// 在x并未聲明的情況下拋出 ReferenceError: x is not defined//3、語法錯誤是拋出 SyntaxErrorvar sum = 1++2;		//SyntaxError: invalid increment operand//4、在變量中保存著意外的類型時,或者訪問不存在的方法時,都會導致 TypeError 錯誤var obj = new 10();		//拋出 TypeError: 10 is not a constructorif("name" in true){}	//拋出 TypeError: invalid 'in' operand trueFunction.prototype.toString.call("name");	//拋出 TypeError: Function.prototype.toString called on incompatible object//5、在使用 encodeURI() 或 decodeURI(),而URI格式不正確,就會導致URIError錯誤。這種錯誤也很少見,因為這兩個函數的容錯性非常高。
</script>	


異常的 try-catch 處理

使用 try-catch 最適合處理那些我們無法控制的錯誤。假設你在使用一個大型的 JavaScript 庫中的函數,該函數可能會有意無意地拋出一些錯誤。由于我們不能修改這個庫的源代碼,所以大可將對該函數的調用放在 try-catch 語句當中,萬一有什么錯誤發生也好恰當的處理它們。如果事前就知道自己的代碼會某種情況下發生錯誤時,再使用 try-chtch 語句就不太合適了。
例如,如果傳遞給函數的參數是字符串而非數值,就會造成函數出錯,那么就應該先檢查參數的類型,然后再決定如何去做。在這種情況下,不應該使用 try-catch 語句。

@Example 1:
<script type="text/javascript" charset="utf-8">try{//do something}catch(error){// error 是發生錯誤時catch塊接受到包含錯誤信息的對象。這個對象包含的實際信息因為瀏覽器而異,但共同的是有一個保存著錯誤消息的message屬性和保存錯誤類型的name屬性。console.log("錯誤消息:"+error.message);console.log("錯誤類型:"+error.name);if(error instanceof TypeError){// 處理類型錯誤}else if(error instanceof ReferenceError){// 處理引用錯誤}else{// 處理其他類型的錯誤}}
</script>

@Example 2:
<script type="text/javascript" charset="utf-8">/*** try-catch-finally: try-catch 語句是可選的,如果try塊中沒有出現錯誤就不會執行 catch 塊語句,但finally 子句中的代碼無論如何都會執行(瀏覽器突然關掉或停電無法工作就另當別論啦)。*/function test1(){try{console.log("執行test1() try塊語句。。。");return 0;}catch(error){console.log("執行test1() catch塊語句。。。");return 1;}finally{console.log("執行test1() finally塊語句。。。");return 520;}}var t1 = test1();console.log("t1: "+t1);function test2(){try{console.log("執行test2() try塊語句。。。");//拋出錯誤讓代碼走 catch 塊throw new Error("測試try-catch-finally.");}catch(error){console.log("執行test2() catch塊語句。。。");return 1;}finally{console.log("執行test2() finally塊語句。。。");return 1314;}}var t2 = test2();console.log("t2: "+t2);function test3(){try{return 1314520;}catch(error){console.log("執行test3() catch塊語句。。。");return 1;}finally{console.log("執行test3() finally塊語句。。。");}}var t3 = test3();console.log("t3: "+t3);/********************* 【開始】運行結果 ********************執行test1() try塊語句。。。執行test1() finally塊語句。。。t1: 520執行test2() try塊語句。。。執行test2() catch塊語句。。。執行test2() finally塊語句。。。t2: 1314執行test3() finally塊語句。。。t3: 1314520********************* 【結束】運行結果 ********************/	/*** 總結:* 		代碼中包含finally子句,那么無論try還是catch語句塊中的return語句都將不會影響到finally子句的執行。因此在使用finally子句之前,* 一定要非常清楚的知道想讓代碼怎么樣。*/
</script>

@Example 3:
<script type="text/javascript" charset="utf-8">/*** 拋出錯誤* * 語法格式:throw 錯誤值(錯誤值的類型沒有要求);* @example:* 		throw 12345;* 		throw "Hello Javascript!";* 		throw true;* 		throw {name:"Javascript"};* 		throw new Error("Something bad happened.");* * 	在遇到throw操作符時,代碼會立即停止執行。僅當有try-catch語句捕獲到被拋出的值是,代碼才會繼續執行。*//*** 拋出自定義錯誤* * 方式一: 使用錯誤類型拋出自定義錯誤消息的通用錯誤。* @example * 		throw new Error("Something bad happened.");* 		throw new SyntaxError("I don't like your syntax style.");* 		throw new RangeError("Sorry,you just don't hava the range.");* 		...* * 	以上例子中拋出都是通用錯誤,帶有一條自定義錯誤消息。瀏覽器會像處理自己生成的錯誤一樣,來處理代碼拋出的錯誤。* 換句話說,瀏覽器會以常規方式報告錯誤,并且會顯示這里的自定義錯誤消息。* * * 方式二:利用原型鏈通過繼承Error來創建自定義錯誤類型,此時,需要為新創建的錯誤類型指定name 和 message 屬性。* @example* * 	function CustomerError(message){* 		this.name = "CustomerError";* 		this.message = message;* 	}* 	CustomerError.prototype = new Error();* 	throw new CustomerError("My error message");*//* * @note* 		IE只有在拋出Error對象的時候才會顯示自定義錯誤消息。對于其他類型,它都無一例外地顯示“exception thrown and not caught”(拋出了異常,并且未被捕獲)*//*** 拋出錯誤的時機* 		函數為什么會執行失敗給出更多信息,拋出自定義錯誤是一種很方便的方式。雖說瀏覽器在執行失敗會回給出相應的錯誤但都不是特別明顯,* 而且不同的瀏覽器給出的錯誤消息都不盡相同。* * 例如下面的precess函數:* 		如果執行函數是傳給它一個字符串參數,那么sort()的調用就會失敗。對此,不同的瀏覽器會給出不同的錯誤消息,但都不是特別明確。如下:* 	IE:對象不支持“sort”屬性或方法。* 	Firefox: values.sort()不是函數。* 	Chrome: 對象名沒有方法 ‘sort’.*  ...*/function process(values){values.sort();for(var i=0,len=values.length;i<len;i++){console.log(values[i]+" , ");}}/*** 優化 process函數:在可能出現錯誤的地方做有效性檢查,在出現錯誤時給出自定義的錯誤信息。* * 好處:重寫后的這個函數,如果values參數不是數組,就會拋出一個錯誤。錯誤消息中包含了函數的名稱,以及為什么會發生錯誤的明確描述。* 如果是一個復雜的web應用程序發生了這個錯誤,那么查找問題的根源就容易多啦。良好的錯誤處理機制應該可以確保代碼中只發生自己拋出的錯誤。*/function process1(values){if(!(values instanceof Array)){throw new Error("process1(): Argument must be an array.");}values.sort();for(var i=0,len=values.length;i<len;i++){console.log(values[i]+" , ");}}/*** 總結:拋出錯誤和捕獲錯誤,我們認為值應該捕獲那些確切知道該如何處理的錯誤。捕獲錯誤的目的在于避免流量器以默認的方式處理它們;* 而拋出錯誤的目的在于提供錯誤發生具體原因的消息。*/
</script>



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373664.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373664.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373664.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

多個集合中的共同和獨特元素

本周&#xff0c;我們將暫時中斷較高級別的問題和技術文章&#xff0c;以解決我們中許多人可能面臨的一些代碼問題。 沒什么花哨的或太辛苦的&#xff0c;但是有一天它可能會節省您15分鐘的時間&#xff0c;偶爾回到基礎上也很不錯。 因此&#xff0c;讓我們開始吧。 有時&…

2016給自己一個交代

一、前言 在關于技術上的學習&#xff0c;常常有這樣那樣的計劃&#xff0c;而最終一個都沒有真正的落實。零散的學習&#xff0c;終究需要系統總結&#xff0c;才能使自己有所沉淀。從畢業至今&#xff0c;我一直在忙碌&#xff0c;為公司付出自己的很多很多&#xff0c;卻只不…

洛克人紅色思考型機器人叫什么_稻船敬二新企劃《紅色灰燼》 依然是機器人風格...

稻船敬二離開CAPCOM之后玩家們紛紛感嘆《洛克人》系列將再無續作&#xff0c;不過在單飛的這段時間里&#xff0c;稻船敬二還是創作了諸如《蒼藍雷霆 剛巴爾特》《Mighty No.9》等類似洛克人風格的作品。其名下的團隊comcept的最新作《Mighty No.9》即將于9月18日發售&#xff…

常見對話框

(1)普通對話框 // 點擊按鈕 彈出一個普通對話框public void click1(View v) {// 構建AlertDialogAlertDialog.Builder builder new Builder(this);builder.setTitle("警告");builder.setMessage("世界上最遙遠的距離是沒有網絡");builder.setPositiveButt…

JavaScript學習隨記——面向對象編程(繼承)

Example:基于原型鏈的繼承 <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>面向對象編程&#xff08;OOP&#xff09;</title></head> <body>…

NSCharacterSet

先上個例子&#xff1a; NSString * str1 [nameInput.textstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]]; NSString * str2 [passwdInput.textstringByTrimmingCharactersInSet:[NSCharacterSetwhitespaceAndNewlineCharacterSet]]; […

Apache Mahout:構建垃圾郵件過濾器服務器

Lucene發生了一些相當有趣的事情。 它最初是作為一個庫&#xff0c;然后其開發人員開始基于它添加新項目。 他們開發了另一個開源項目&#xff0c;該項目將向Lucene添加爬網功能&#xff08;以及其他功能&#xff09;。 Nutch實際上是任何人都可以使用或修改的功能齊全的Web Se…

建模步驟_古建設計 | sketchup建模步驟教程(簡易入門版)

前言本篇教程主要是針對古建建模入門者。小N給大家分享一套我相對簡易的建模步驟。(PS&#xff1a;但是估計有些人可能會感覺我做的東西已經繁瑣了……)因為主要是為了讓大家熟悉、入門和好記憶。所以講的東西&#xff0c;小N我會相對簡單&#xff0c;有些細節的內容不會更多展…

JavaScript模塊化

JavaScript模塊化的實現方式&#xff1a; <!DOCTYPE HTML> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>模塊化</title></head> <body><script type&quo…

Linux下面的IO模型

1. Linux下的五種I/O模型 阻塞I/O模型&#xff1a; 一直阻塞 應用程序調用一個IO函數&#xff0c;導致應用程序阻塞&#xff0c;等待數據準備好。 如果數據沒有準備好&#xff0c;一直等待….數據準備好了&#xff0c;從內核拷貝到用戶空間,IO函數返回成功指示。 我們 第一…

改變導航欄上邊的狀態欄顏色

#pragma mark - 改變狀態欄顏色 -(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }轉載于:https://www.cnblogs.com/block123/p/5195203.html

PIT和TestNG突變測試簡介

變異測試是一種技術&#xff0c;它可以發現測試未涵蓋代碼的哪些部分。 它類似于代碼覆蓋范圍 &#xff0c;但變異測試不限于在測試期間執行給定行的事實。 這個想法是修改生產代碼&#xff08;引入突變&#xff09;&#xff0c;這應該改變其行為&#xff08;產生不同的結果&am…

JavaScript內存管理——優化內存占用

使用具備垃圾收集機制的語言編寫程序&#xff0c;開發人員一般不必操心內存管理的問題。但是&#xff0c;JavaScript在進行內存管理及垃圾收集時面臨的問題還是有點與眾不同。其中最主要的一個問題&#xff0c;就是分配給Web瀏覽器的可用內存數量通常要比分配給桌面應用程序的少…

Java 8的烹調方式– Lambda項目

什么是project lambda &#xff1a;Project lambda是用于以Java語言語法啟用lambda表達式的項目。 Lambda表達式是功能編程語言&#xff08;如lisp&#xff09;中的主要語法。 Groovy將是支持lambda表達式&#xff08;也稱為閉包&#xff09;的java的最接近親戚。 那么什么是la…

ffmpeg文檔38-視頻源

38 視頻源 下面是當前有效的視頻源 buffer 緩沖視頻幀&#xff0c;其可以作為濾鏡鏈圖的環節 它通常用于編程&#xff0c;特別是通過libavfilter/vsrc_buffer.h的接口。 接受如下參數&#xff1a; video_size 指定視頻尺寸&#xff0c;(同時指定width 和 height)。語法同于ffmp…

系統架構的演變 -----自 羅文浩

轉自&#xff1a;https://my.oschina.net/lwhmdj0823/blog/617713版權聲明&#xff1a;羅文浩所有摘要: 一個成熟的大型網站&#xff08;如淘寶、京東等&#xff09;的系統架構并不是開始設計就具備完整的高性能、高可用、安全等特性&#xff0c;它總是隨著用戶量的增加&#x…

前端請求接口post_前端如何優雅地模擬接口請求?(給你的代碼加點小意外)

前言&#xff1a;作為一名前端開發程序猿&#xff0c;每天都被產品經理催著開發&#xff0c;項目一啟動&#xff0c;產品就過來了。噓寒問暖&#xff1a;大胸弟&#xff0c;你啥時開始做啊&#xff1f;一般我們都會直接告訴TA&#xff0c;你先找接口解決數據問題。而我們也會經…

cron表達式詳解

Cron表達式是一個字符串&#xff0c;字符串以5或6個空格隔開&#xff0c;分為6或7個域&#xff0c;每一個域代表一個含義&#xff0c;Cron有如下兩種語法格式&#xff1a; Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth Month …

將Ehcache添加到Openxava應用程序

介紹 本文介紹如何在Openxava應用程序上快速啟用Ehcache&#xff0c;從而提高性能。 查看實體及其圖時&#xff0c;將加載關系。 添加第二級緩存可加快關聯元素的檢索速度&#xff0c;因為已加載的元素是從緩存而不是數據庫中檢索的。 最終&#xff0c;該頁面解釋了分鐘項目如…

java mongodb 返回所有field_JAVA高級之反射

更多精彩&#xff0c;請點擊上方藍字關注我們&#xff01;今天跟大家分享JAVA高級之反射的知識。一、什么是反射反射就是把Java類中的各個成分映射成一個個的Java對象。即在運行狀態中&#xff0c;對于任意一個類&#xff0c;都能夠知道這個類的所以屬性和方法&#xff1b;對于…