国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

錯誤檢測(1)------try-catch語句 From 《高程3》

UnixAgain / 2274人閱讀

摘要:類型的錯誤會在數(shù)值超出相應范圍時觸發(fā)。最常發(fā)生類型錯誤的情況,就是傳遞給函數(shù)的參數(shù)事先未經(jīng)檢查,結(jié)果傳入類型與預期類型不相符。捕獲錯誤的目的在于避免瀏覽器以默認方式處理它們而拋出錯誤的目的在于提供錯誤發(fā)生具體原因的消息。

0 前言

目前讀到了《高程3》的錯誤檢測部分,現(xiàn)在先挖一個坑,關于錯誤檢測應該寫三篇總結(jié):firebug檢測錯誤和輸出信息;try-catch錯誤捕獲;常見錯誤種類。

本篇邏輯思路如下:首先介紹進行錯誤捕獲的try-catch語句;然后介紹常見的錯誤類型,這點會結(jié)合firebug來說明;其次介紹try-catch語句和錯誤類型結(jié)合使用以捕獲錯誤;但是如果捕獲的錯誤以瀏覽器的語言表示,還是很難找到錯誤,因此推薦使用throw拋出開發(fā)者自定義的錯誤,這樣,錯誤的位置和原因就會更易發(fā)現(xiàn);最后就錯誤拋出和錯誤捕獲進行了總結(jié)討論。

1 try-catch簡介

良好的錯誤處理機制可以讓用戶和開發(fā)者及時得到提醒,知道到底發(fā)生了什么事,因而不會驚惶失措。ECMA-262 第 3 版引入了 try-catch 語句,作為 JavaScript 中處理異常的一種標準方式。基本的語法如下所示,

</>復制代碼

  1. try{
  2. // 可能會導致錯誤的代碼
  3. } catch(error){
  4. // 在錯誤發(fā)生時怎么處理
  5. }

我們應該把所有可能會拋出錯誤的代碼都放在 try 語句塊中,而把那些用于錯誤處理的代碼放在 catch 塊中。如果 try 塊中的任何代碼發(fā)生了錯誤,就會立即退出代碼執(zhí)行過程,然后接著執(zhí)行 catch 塊。此時, catch 塊會接收到一個包含錯誤信息的對象。即使你不想使用這個錯誤對象,也要指定一個參數(shù)名。這個對象中包含的實際信息會因瀏覽器而異,但共同的是有一個保存著錯誤消息的 message 屬性。這個 message 屬性是唯一一個能夠保證所有瀏覽器都支持的屬性,除此之外, IE、 Firefox、 Safari、 Chrome 以及 Opera 都為錯誤對象添加了其他相關信息。在跨瀏覽器編程時,最好還是只使用 message 屬性。
一個測試例子:

只要代碼中包含 finally 子句,則無論 try 或 catch 語句塊中包含什么代碼——甚至 return 語句,都不會阻止 finally 子句的執(zhí)行。如下例所示:

</>復制代碼

  1. function testFinally() {
  2. try {
  3. return 2;
  4. } catch (error) {
  5. return 1;
  6. } finally {
  7. return 0;
  8. }
  9. }
  10. function testWithoutFinally() {
  11. try {
  12. return 2;
  13. } catch (error) {
  14. return 1;
  15. }
  16. }
  17. console.log(testFinally());//輸出0
  18. console.log(testWithoutFinally());//輸出2

如果提供 finally 子句,則 catch 子句就成了可選的(catch 或 finally 有一個即可)。 IE7 及更早版本中有一個 bug:除非有 catch 子句,否則 finally 中的代碼永遠不會執(zhí)行。IE8 修復了這個 bug。如果你仍然要考慮 IE 的早期版本,那就只好提供一個 catch 子句,哪怕里面什么都不寫。

另一個測試實例:

</>復制代碼

  1. var example = function() {
  2. try {
  3. window.someNonexistentFunction();
  4. } catch (error) {
  5. console.log(error.name);
  6. console.log(error.message);
  7. return 1;
  8. } finally {
  9. console.log("everything is over");
  10. }
  11. };
  12. example();

測試結(jié)果:先后執(zhí)行了try/catch/finally中的語句,問題是為什么會在最后執(zhí)行一次catch中的return語句?留給自己一個問題吧。

2 錯誤類型

每種錯誤都有對應的錯誤類型,而當錯誤發(fā)生時,就會拋出相應類型的錯誤對象(error object)。ECMA-262 定義了下列 7 種錯誤類型:

1) Error 是基類型,其他錯誤類型都繼承自該類型。因此,所有錯誤類型共享了一組相同的屬性(錯誤對象中的方法全是默認的對象方法)。
2)EvalError 類型的錯誤會在使用 eval()函數(shù)而發(fā)生異常時被拋出,但是拋出的錯誤不一定是EvalError 類型。如果沒有把 eval()當成函數(shù)調(diào)用,F(xiàn)irefox 4+和 IE8 對此拋出 TypeError。

3)RangeError 類型的錯誤會在數(shù)值超出相應范圍時觸發(fā)。例如,在定義數(shù)組時,如果指定了數(shù)組不支持的項數(shù)(如-20 或 Number.MAX_VALUE),就會觸發(fā)這種錯誤。

4)在找不到對象的情況下,會發(fā)生 ReferenceError(這種情況下,會直接導致人所共知的"object expected"瀏覽器錯誤)。通常,在訪問不存在的變量時,就會發(fā)生這種錯誤。

5) 至于 SyntaxError,當我們把語法錯誤的 JavaScript 字符串傳入 eval()函數(shù)時,就會導致此類錯誤。如果語法錯誤的代碼出現(xiàn)在 eval()函數(shù)之外,則不太可能使用 SyntaxError,因為此時的語法錯誤會導致 JavaScript 代碼立即停止執(zhí)行。

6)TypeError 類型在 JavaScript 中會經(jīng)常用到,在變量中保存著意外的類型時,或者在訪問不存在的方法時,都會導致這種錯誤。錯誤的原因雖然多種多樣,但歸根結(jié)底還是由于在執(zhí)行特定于類型的操作時,變量的類型并不符合要求所致。最常發(fā)生類型錯誤的情況,就是傳遞給函數(shù)的參數(shù)事先未經(jīng)檢查,結(jié)果傳入類型與預期類型不相符。

7) 在使用 encodeURI()或 decodeURI(),而 URI 格式不正確時,就會導致 URIError 錯誤。這種錯誤也很少見,因為前面說的這兩個函數(shù)的容錯性非常高。

上述測試過程在FF如下:

3 使用try-catch語句捕獲錯誤

要想知道錯誤的類型,可以像下面這樣在 try-catch 語句的 catch 語句中使用 instanceof 操作符。

</>復制代碼

  1. try {
  2. someFunction();
  3. } catch (error){
  4. if (error instanceof TypeError){
  5. //處理類型錯誤
  6. } else if (error instanceof ReferenceError){
  7. //處理引用錯誤
  8. } else {
  9. //處理其他類型的錯誤
  10. }
  11. }

在跨瀏覽器編程中,檢查錯誤類型是確定處理方式的最簡便途徑;而包含在 message 屬性中的錯誤消息會因瀏覽器而異。
使用 try-catch 最適合處理那些我們無法控制的錯誤。假設你在使用一個大型 JavaScript 庫中的函數(shù),該函數(shù)可能會有意無意地拋出一些錯誤。由于我們不能修改這個庫的源代碼,所以大可將對該函數(shù)的調(diào)用放在 try-catch 語句當中,萬一有什么錯誤發(fā)生,也好恰當?shù)靥幚硭鼈儭?/p> 4 throw拋出自定義錯誤

與 try-catch 語句相配的還有一個 throw 操作符,用于隨時拋出自定義錯誤。拋出錯誤時,必須要給 throw 操作符指定一個值,這個值是什么類型,沒有要求。在遇到 throw 操作符時,代碼會立即停止執(zhí)行。僅當有 try-catch 語句捕獲到被拋出的值時,代碼才會繼續(xù)執(zhí)行。

通過使用自定義的內(nèi)置錯誤類型,可以更真實地模擬瀏覽器錯誤。每種錯誤類型的構造函數(shù)接收一個參數(shù),即實際的錯誤消息。下面是例子。

</>復制代碼

  1. throw new Error("Something bad happened.");
  2. throw new SyntaxError("I don’t like your syntax.");
  3. throw new TypeError("What type of variable do you take me for?");
  4. throw new RangeError("Sorry, you just don’t have the range.");
  5. throw new EvalError("That doesn’t evaluate.");
  6. throw new URIError("Uri, is that you?");
  7. throw new ReferenceError("You didn’t cite your references properly.");

瀏覽器會像處理自己生成的錯誤一樣,來處理這些代碼拋出的錯誤。換句話說,瀏覽器會以常規(guī)方式報告這一錯誤,并且會顯示這里的自定義錯誤消息。

拋出自定義錯誤的意義:方便快速定位錯誤并糾錯。雖然瀏覽器會自己報錯,但是這些報錯信息在瀏覽器中達不到統(tǒng)一,而且如果出現(xiàn)同種類型錯誤,查找來源是復雜的,尤其是在數(shù)千行代碼中。但是如果你知道可能的代碼錯誤,可以直接在代碼中添加這些自定義的錯誤,一旦發(fā)生這些錯誤,瀏覽器就報出自定義錯誤,關鍵是這個錯誤的位置和類型顯而易見。
實例:一個必須接收數(shù)組作為參數(shù)的函數(shù)如果接收字符串作為參數(shù)就會報錯。

</>復制代碼

  1. function process(values){
  2. values.sort();
  3. for (var i=0, len=values.length; i < len; i++){
  4. if (values[i] > 100){
  5. return values[i];
  6. }
  7. }
  8. return -1;
  9. }
  10. var a = process("string");
  11. console.log(a);

firebug中結(jié)果:

添加自定義錯誤后的代碼:

</>復制代碼

  1. function process(values){
  2. if (!(values instanceof Array)){
  3. throw new Error("process(): Argument must be an array.");
  4. }
  5. values.sort();
  6. for (var i=0, len=values.length; i < len; i++){
  7. if (values[i] > 100){
  8. return values[i];
  9. }
  10. }
  11. return -1;
  12. }
  13. var a = process("string");
  14. console.log(a);

firebug中結(jié)果:

如果 values 參數(shù)不是數(shù)組,就會拋出一個錯誤。錯誤消息中包含了函數(shù)的名稱,以及為什么會發(fā)生錯誤的明確描述。如果一個復雜的 Web 應用程序發(fā)生了這個錯誤,那么查找問題的根源也就容易多了。

利用原型鏈還可以通過繼承 Error 來創(chuàng)建自定義錯誤類型。此時,需要為新創(chuàng)建的錯誤類型指定 name 和 message 屬性。
一個實例:

</>復制代碼

  1. //通過繼承Error實現(xiàn)自定義錯誤類型,要定義name和message屬性
  2. function CustomError(message){
  3. this.name = "CustomError";
  4. this.message = message;
  5. }
  6. CustomError.prototype = new Error();
  7. function process(values){
  8. //如果出現(xiàn)錯誤,就拋出自定義錯誤類型的對象實例
  9. if (!(values instanceof Array)){
  10. throw new CustomError("process(): Argument must be an array.");
  11. }
  12. values.sort();
  13. for (var i=0, len=values.length; i < len; i++){
  14. if (values[i] > 100){
  15. return values[i];
  16. }
  17. }
  18. return -1;
  19. }
  20. process("string");

firebug顯示自定義類型的錯誤:

5 拋出錯誤與使用 try-catch捕獲錯誤

關于何時該拋出錯誤,而何時該使用 try-catch 來捕獲它們,是一個老生常談的問題。一般來說,應用程序架構的較低層次中經(jīng)常會拋出錯誤,但這個層次并不會影響當前執(zhí)行的代碼,因而錯誤通常得不到真正的處理。如果你打算編寫一個要在很多應用程序中使用的 JavaScript 庫,甚至只編寫一個可能會在應用程序內(nèi)部多個地方使用的輔助函數(shù),我都強烈建議你在拋出錯誤時提供詳盡的信息。然后,即可在應用程序中捕獲并適當?shù)靥幚磉@些錯誤。
說到拋出錯誤與捕獲錯誤,我們認為只應該捕獲那些你確切地知道該如何處理的錯誤。捕獲錯誤的目的在于避免瀏覽器以默認方式處理它們;而拋出錯誤的目的在于提供錯誤發(fā)生具體原因的消息。

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87976.html

相關文章

  • 錯誤檢測1)------try-catch語句 From高程3

    摘要:類型的錯誤會在數(shù)值超出相應范圍時觸發(fā)。最常發(fā)生類型錯誤的情況,就是傳遞給函數(shù)的參數(shù)事先未經(jīng)檢查,結(jié)果傳入類型與預期類型不相符。捕獲錯誤的目的在于避免瀏覽器以默認方式處理它們而拋出錯誤的目的在于提供錯誤發(fā)生具體原因的消息。 0 前言 目前讀到了《高程3》的錯誤檢測部分,現(xiàn)在先挖一個坑,關于錯誤檢測應該寫三篇總結(jié):firebug檢測錯誤和輸出信息;try-catch錯誤捕獲;常見錯誤種類。...

    Thanatos 評論0 收藏0
  • 高程3總結(jié)#第17章錯誤處理與調(diào)試

    錯誤處理與調(diào)試 錯誤處理 try-catch語句 try{ //可能會導致錯誤的代碼 }catch(error){ //在錯誤發(fā)生時怎么處理 } 發(fā)生錯誤時可以顯示瀏覽器給出的信息 try{ window.someNonexistentFunction(); }catch(error){ alert(error.message); } 在try-catch語句中是可選的,但...

    fizz 評論0 收藏0
  • 高程(第四章) 變量、作用域和內(nèi)存問題

    摘要:不允許直接訪問內(nèi)存中的位置,也就是說不能直接操作對象的內(nèi)存空間。在操作對象時,實際上是在操作對象的引用而不是實際的對象。解除引用的真正作用是讓值脫離執(zhí)行環(huán)境,以便垃圾收集器下次運行時將其回收 1 基本類型和引用類型的值 基本數(shù)據(jù)類型是按值訪問的,因為可以操作保存在變量中的實際的值 基本類型值在內(nèi)存中占據(jù)固定大小的空間,因此被保存在棧內(nèi)存中 引用類型的值是保存在內(nèi)存中的對象。JavaSc...

    xavier 評論0 收藏0
  • JavaScript 錯誤處理與調(diào)試——“錯誤處理”的注意要點

    摘要:使用函數(shù)發(fā)生異常時拋出。數(shù)值超出相應范圍時拋出。拋出錯誤與相配的還有一個操作符,用于拋出自定義錯誤。錯誤事件沒有通過處理的錯誤都會觸發(fā)對象的事件。任何瀏覽器中,事件處理程序都不會創(chuàng)建對象,但它可以接受個參數(shù)錯誤消息錯誤所在的和行號。 try-catch語句 該語句最適合處理那些我們無法控制的錯誤,在明明白白地知道自己的代碼會發(fā)生錯誤時,再使用該語句就不太合適了。 ECMA-262第3...

    draveness 評論0 收藏0
  • javascript高程第三章部分筆記

    摘要:標識符按以下規(guī)則組合第一個字符必須是一個字母,下劃線或一個美元符號。包含值的變量和尚未定義的變量是不一樣的,例子報錯然而,對未初始化的變量執(zhí)行操作符會返回值,對未聲明的變量執(zhí)行操作符統(tǒng)一也會返回值。 1. 語法 1.1 區(qū)分大小寫 變量、函數(shù)名和操作費都區(qū)分大小寫。 1.2 標識符 標識符指變量、函數(shù)、屬性的名字,或者函數(shù)的參數(shù)。標識符按以下規(guī)則組合: 第一個字符必須是一個字母,下劃線...

    lentoo 評論0 收藏0

發(fā)表評論

0條評論

UnixAgain

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<