日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript学习随记——错误类型

發(fā)布時(shí)間:2023/12/1 javascript 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript学习随记——错误类型 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

錯(cuò)誤類型: 執(zhí)行代碼期間可能會(huì)發(fā)生的錯(cuò)誤有多種類型。每種錯(cuò)誤都有對應(yīng)的錯(cuò)誤類型,而當(dāng)錯(cuò)誤發(fā)生時(shí),就會(huì)拋出相應(yīng)類型的錯(cuò)誤對象。

ECMA-262定義的7種錯(cuò)誤類型

  • Error: 是錯(cuò)誤的基類型,其他錯(cuò)誤類型都繼承該類型。Error 類型的錯(cuò)誤很少見,如果有也是瀏覽器拋出的。
  • EvalError: 使用eval() 函數(shù)而發(fā)生異常時(shí)被拋出。
  • RangeError:在數(shù)值超過相應(yīng)范圍是就會(huì)被拋出。
  • ReferenceError: 在找不到對象的情況下,會(huì)發(fā)生 ReferenceEroor 。通常,在訪問不存在的變量時(shí),就會(huì)發(fā)生這種錯(cuò)誤。
  • SyntaxError: 語法錯(cuò)誤時(shí)會(huì)拋出此異常。
  • TypeError: 在變量中保存著意外的類型時(shí),或者訪問不存在的方法時(shí),都會(huì)導(dǎo)致這種錯(cuò)誤。錯(cuò)誤的原因雖然多種多樣,但歸根結(jié)底還是由于在執(zhí)行特定于類型的操作時(shí),變量的類型并不符合要求所致。
  • URIError: 在使用 encodeURI() 或 decodeURI(),而URI格式不正確,就會(huì)導(dǎo)致URIError錯(cuò)誤。
  • @Example: <script type="text/javascript" charset="utf-8">//1、 數(shù)值超過范圍時(shí)拋出 RangeErrorvar item1 = new Array(-10); //拋出 RangeError: invalid array lengthvar item1 = new Array(Number.MAX_VALUE); //拋出 RangeError: invalid array length//2、找不到對象時(shí)會(huì)拋出 ReferenceErrorvar obj = x; // 在x并未聲明的情況下拋出 ReferenceError: x is not defined//3、語法錯(cuò)誤是拋出 SyntaxErrorvar sum = 1++2; //SyntaxError: invalid increment operand//4、在變量中保存著意外的類型時(shí),或者訪問不存在的方法時(shí),都會(huì)導(dǎo)致 TypeError 錯(cuò)誤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格式不正確,就會(huì)導(dǎo)致URIError錯(cuò)誤。這種錯(cuò)誤也很少見,因?yàn)檫@兩個(gè)函數(shù)的容錯(cuò)性非常高。 </script>

    異常的 try-catch 處理

    使用 try-catch 最適合處理那些我們無法控制的錯(cuò)誤。假設(shè)你在使用一個(gè)大型的 JavaScript 庫中的函數(shù),該函數(shù)可能會(huì)有意無意地拋出一些錯(cuò)誤。由于我們不能修改這個(gè)庫的源代碼,所以大可將對該函數(shù)的調(diào)用放在 try-catch 語句當(dāng)中,萬一有什么錯(cuò)誤發(fā)生也好恰當(dāng)?shù)奶幚硭鼈儭H绻虑熬椭雷约旱拇a會(huì)某種情況下發(fā)生錯(cuò)誤時(shí),再使用 try-chtch 語句就不太合適了。 例如,如果傳遞給函數(shù)的參數(shù)是字符串而非數(shù)值,就會(huì)造成函數(shù)出錯(cuò),那么就應(yīng)該先檢查參數(shù)的類型,然后再?zèng)Q定如何去做。在這種情況下,不應(yīng)該使用 try-catch 語句。

    @Example 1:
    <script type="text/javascript" charset="utf-8">try{//do something}catch(error){// error 是發(fā)生錯(cuò)誤時(shí)catch塊接受到包含錯(cuò)誤信息的對象。這個(gè)對象包含的實(shí)際信息因?yàn)闉g覽器而異,但共同的是有一個(gè)保存著錯(cuò)誤消息的message屬性和保存錯(cuò)誤類型的name屬性。console.log("錯(cuò)誤消息:"+error.message);console.log("錯(cuò)誤類型:"+error.name);if(error instanceof TypeError){// 處理類型錯(cuò)誤}else if(error instanceof ReferenceError){// 處理引用錯(cuò)誤}else{// 處理其他類型的錯(cuò)誤}} </script>
    @Example 2:
    <script type="text/javascript" charset="utf-8">/*** try-catch-finally: try-catch 語句是可選的,如果try塊中沒有出現(xiàn)錯(cuò)誤就不會(huì)執(zhí)行 catch 塊語句,但finally 子句中的代碼無論如何都會(huì)執(zhí)行(瀏覽器突然關(guān)掉或停電無法工作就另當(dāng)別論啦)。*/function test1(){try{console.log("執(zhí)行test1() try塊語句。。。");return 0;}catch(error){console.log("執(zhí)行test1() catch塊語句。。。");return 1;}finally{console.log("執(zhí)行test1() finally塊語句。。。");return 520;}}var t1 = test1();console.log("t1: "+t1);function test2(){try{console.log("執(zhí)行test2() try塊語句。。。");//拋出錯(cuò)誤讓代碼走 catch 塊throw new Error("測試try-catch-finally.");}catch(error){console.log("執(zhí)行test2() catch塊語句。。。");return 1;}finally{console.log("執(zhí)行test2() finally塊語句。。。");return 1314;}}var t2 = test2();console.log("t2: "+t2);function test3(){try{return 1314520;}catch(error){console.log("執(zhí)行test3() catch塊語句。。。");return 1;}finally{console.log("執(zhí)行test3() finally塊語句。。。");}}var t3 = test3();console.log("t3: "+t3);/********************* 【開始】運(yùn)行結(jié)果 ********************執(zhí)行test1() try塊語句。。。執(zhí)行test1() finally塊語句。。。t1: 520執(zhí)行test2() try塊語句。。。執(zhí)行test2() catch塊語句。。。執(zhí)行test2() finally塊語句。。。t2: 1314執(zhí)行test3() finally塊語句。。。t3: 1314520********************* 【結(jié)束】運(yùn)行結(jié)果 ********************/ /*** 總結(jié):* 代碼中包含finally子句,那么無論try還是catch語句塊中的return語句都將不會(huì)影響到finally子句的執(zhí)行。因此在使用finally子句之前,* 一定要非常清楚的知道想讓代碼怎么樣。*/ </script>
    @Example 3:
    <script type="text/javascript" charset="utf-8">/*** 拋出錯(cuò)誤* * 語法格式:throw 錯(cuò)誤值(錯(cuò)誤值的類型沒有要求);* @example:* throw 12345;* throw "Hello Javascript!";* throw true;* throw {name:"Javascript"};* throw new Error("Something bad happened.");* * 在遇到throw操作符時(shí),代碼會(huì)立即停止執(zhí)行。僅當(dāng)有try-catch語句捕獲到被拋出的值是,代碼才會(huì)繼續(xù)執(zhí)行。*//*** 拋出自定義錯(cuò)誤* * 方式一: 使用錯(cuò)誤類型拋出自定義錯(cuò)誤消息的通用錯(cuò)誤。* @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.");* ...* * 以上例子中拋出都是通用錯(cuò)誤,帶有一條自定義錯(cuò)誤消息。瀏覽器會(huì)像處理自己生成的錯(cuò)誤一樣,來處理代碼拋出的錯(cuò)誤。* 換句話說,瀏覽器會(huì)以常規(guī)方式報(bào)告錯(cuò)誤,并且會(huì)顯示這里的自定義錯(cuò)誤消息。* * * 方式二:利用原型鏈通過繼承Error來創(chuàng)建自定義錯(cuò)誤類型,此時(shí),需要為新創(chuàng)建的錯(cuò)誤類型指定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對象的時(shí)候才會(huì)顯示自定義錯(cuò)誤消息。對于其他類型,它都無一例外地顯示“exception thrown and not caught”(拋出了異常,并且未被捕獲)*//*** 拋出錯(cuò)誤的時(shí)機(jī)* 函數(shù)為什么會(huì)執(zhí)行失敗給出更多信息,拋出自定義錯(cuò)誤是一種很方便的方式。雖說瀏覽器在執(zhí)行失敗會(huì)回給出相應(yīng)的錯(cuò)誤但都不是特別明顯,* 而且不同的瀏覽器給出的錯(cuò)誤消息都不盡相同。* * 例如下面的precess函數(shù):* 如果執(zhí)行函數(shù)是傳給它一個(gè)字符串參數(shù),那么sort()的調(diào)用就會(huì)失敗。對此,不同的瀏覽器會(huì)給出不同的錯(cuò)誤消息,但都不是特別明確。如下:* IE:對象不支持“sort”屬性或方法。* Firefox: values.sort()不是函數(shù)。* Chrome: 對象名沒有方法 ‘sort’.* ...*/function process(values){values.sort();for(var i=0,len=values.length;i<len;i++){console.log(values[i]+" , ");}}/*** 優(yōu)化 process函數(shù):在可能出現(xiàn)錯(cuò)誤的地方做有效性檢查,在出現(xiàn)錯(cuò)誤時(shí)給出自定義的錯(cuò)誤信息。* * 好處:重寫后的這個(gè)函數(shù),如果values參數(shù)不是數(shù)組,就會(huì)拋出一個(gè)錯(cuò)誤。錯(cuò)誤消息中包含了函數(shù)的名稱,以及為什么會(huì)發(fā)生錯(cuò)誤的明確描述。* 如果是一個(gè)復(fù)雜的web應(yīng)用程序發(fā)生了這個(gè)錯(cuò)誤,那么查找問題的根源就容易多啦。良好的錯(cuò)誤處理機(jī)制應(yīng)該可以確保代碼中只發(fā)生自己拋出的錯(cuò)誤。*/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]+" , ");}}/*** 總結(jié):拋出錯(cuò)誤和捕獲錯(cuò)誤,我們認(rèn)為值應(yīng)該捕獲那些確切知道該如何處理的錯(cuò)誤。捕獲錯(cuò)誤的目的在于避免流量器以默認(rèn)的方式處理它們;* 而拋出錯(cuò)誤的目的在于提供錯(cuò)誤發(fā)生具體原因的消息。*/ </script>


    總結(jié)

    以上是生活随笔為你收集整理的JavaScript学习随记——错误类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。