成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專(zhuān)欄INFORMATION COLUMN

JavaScript 錯(cuò)誤處理與調(diào)試——“錯(cuò)誤處理”的注意要點(diǎn)

draveness / 2896人閱讀

摘要:使用函數(shù)發(fā)生異常時(shí)拋出。數(shù)值超出相應(yīng)范圍時(shí)拋出。拋出錯(cuò)誤與相配的還有一個(gè)操作符,用于拋出自定義錯(cuò)誤。錯(cuò)誤事件沒(méi)有通過(guò)處理的錯(cuò)誤都會(huì)觸發(fā)對(duì)象的事件。任何瀏覽器中,事件處理程序都不會(huì)創(chuàng)建對(duì)象,但它可以接受個(gè)參數(shù)錯(cuò)誤消息錯(cuò)誤所在的和行號(hào)。

try-catch語(yǔ)句

該語(yǔ)句最適合處理那些我們無(wú)法控制的錯(cuò)誤,在明明白白地知道自己的代碼會(huì)發(fā)生錯(cuò)誤時(shí),再使用該語(yǔ)句就不太合適了。

ECMA-262第3版引入了try-catch語(yǔ)句,基本的語(yǔ)法如下所示:

try {
    // statements
} catch(e) {
    // statements
    console.log(e);
}

即使不使用這個(gè)錯(cuò)誤對(duì)象,也要起個(gè)名字,對(duì)象中包含的實(shí)際信息因?yàn)g覽器而異,但共同的是一個(gè)保存錯(cuò)誤消息的

message屬性,ECMA-262還規(guī)定了一個(gè)保存錯(cuò)誤類(lèi)型的

name屬性

所有瀏覽器都支持這個(gè)屬性(Opera 9之前的版本除外)。

try {
    document.getElementByIfd("fdsa");
} catch(e) {
    // statements
    console.log(e.message); //document.getElementByIfd is not a function
    console.log(e.name); //TypeError
}

又如:

try {
    var x = 1;
    var y = 0;
    console.log(z);
} catch(e) {
    // statements
    console.log(e.message); //z is not defined
    console.log(e.name); //ReferenceError
}
finally子句

雖然在try-catch塊中是可選的,但finally子句一經(jīng)用,無(wú)論如何都會(huì)執(zhí)行,甚至return語(yǔ)句都不會(huì)阻止,例如:

function test() {
    try {
        return 1;
    } catch (error) {
        return 2;
    } finally {
        return 3;
    }
}

上述代碼返回3,當(dāng)try中代碼正常執(zhí)行,finally會(huì)執(zhí)行;當(dāng)try中代碼出現(xiàn)錯(cuò)誤,catch代碼會(huì)執(zhí)行,finally代碼也會(huì)執(zhí)行。

錯(cuò)誤類(lèi)型

每種錯(cuò)誤都有對(duì)應(yīng)的錯(cuò)誤類(lèi)型,而當(dāng)錯(cuò)誤發(fā)生時(shí),就會(huì)拋出相應(yīng)類(lèi)型的錯(cuò)誤對(duì)象,ECMA-262定義了7種錯(cuò)誤類(lèi)型:

* `Error`: 基類(lèi)型。
* `EvalError`: 使用eval()函數(shù)發(fā)生異常時(shí)拋出。
* `RangeError`: 數(shù)值超出相應(yīng)范圍時(shí)拋出。
* `ReferenceError`: 找不到對(duì)象時(shí)拋出。
* `SyntaxError`: 使用eval()函數(shù)中的字符串有語(yǔ)法錯(cuò)誤時(shí)拋出。
* `TypeError`: 在變量中保存意外類(lèi)型或訪(fǎng)問(wèn)不存在的方法時(shí)拋出。
* `URIError`: 使用encodeURI或decodeURI()中URI格式不正確時(shí)拋出。
拋出錯(cuò)誤

與try-catch相配的還有一個(gè)

throw操作符,用于拋出自定義錯(cuò)誤。

拋出錯(cuò)誤時(shí),必須給throw操作符指定一個(gè)值,這個(gè)值的類(lèi)型沒(méi)有要求,例如:

throw 123;
throw "Hello World!";

在遇到throw操作符時(shí),代碼會(huì)立即停止執(zhí)行。

通過(guò)使用某種內(nèi)置錯(cuò)誤類(lèi)型,可以更真實(shí)

如:

try {
    throw new Error("nooo");
} catch (e) {
    console.log(e.message); //nooo
    console.log(e.name); //Error
}

或:

throw new SyntaxError("wwwwtttttfffff");

也可以創(chuàng)建自定義錯(cuò)誤類(lèi)型:

function CustomError (message) {
    this.name = "CustomError";
    this.message = message;
}
CustomError.prototype = new Error();
var somebug = new CustomError("wtf");

try {
    throw somebug
} catch(e) {
    console.log(e.name); //CustomError
    console.log(e.message); //wtf
}

捕獲錯(cuò)誤的目的在于避免瀏覽器以默認(rèn)方式處理它們;而拋出錯(cuò)誤的目的在于提供錯(cuò)誤發(fā)生具體原因的消息。

錯(cuò)誤(error)事件

沒(méi)有通過(guò)try-catch處理的錯(cuò)誤都會(huì)觸發(fā)window對(duì)象的

error事件。任何瀏覽器中,onerror事件處理程序都不會(huì)創(chuàng)建event對(duì)象,但它可以接受3個(gè)參數(shù):錯(cuò)誤消息、錯(cuò)誤所在的URL和行號(hào)。

只要發(fā)生錯(cuò)誤,無(wú)論是不是瀏覽器生成的,都會(huì)觸發(fā)error事件,并執(zhí)行這個(gè)事件處理程序,如果在事件處理程序中返回false,可以阻止瀏覽器報(bào)告錯(cuò)誤的默認(rèn)行為,例如:

throw new Error("hello there");
window.onerror = function() {
    console.log(message); //Uncaught Error: hello there
    return false;
}

圖像也支持error事件,只要圖像的src屬性中的URL不能返回可以被識(shí)別的圖像格式,就會(huì)觸發(fā)error事件。

var x = new Image();
x.onerror = function () {
    console.log("message"); //message
};
x.src = "fds.png";
常見(jiàn)的錯(cuò)誤類(lèi)型

常見(jiàn)的三種錯(cuò)誤類(lèi)型為:

類(lèi)型轉(zhuǎn)換錯(cuò)誤

數(shù)據(jù)類(lèi)型錯(cuò)誤

通信錯(cuò)誤

類(lèi)型轉(zhuǎn)換錯(cuò)誤

類(lèi)型轉(zhuǎn)換錯(cuò)誤常發(fā)生在使用某個(gè)操作符或者自動(dòng)轉(zhuǎn)換數(shù)據(jù)類(lèi)型的場(chǎng)景

第一種常見(jiàn)錯(cuò)誤是使用相等和不等操作符

console.log(1 == "1"); //true
console.log(1 == true); //true

改進(jìn): 推薦使用全等( === ) 和非全等( !== ) 操作符, 來(lái)避免發(fā)生因?yàn)槭褂孟嗟群筒坏炔僮鞣麜r(shí)引發(fā)的類(lèi)型轉(zhuǎn)換錯(cuò)誤;

console.log(1 === "1"); //false
console.log(1 === true); //false

第二種常見(jiàn)錯(cuò)誤是在流控制語(yǔ)句中使用非布爾值.

function concat(str1, str2) {
    if (str2) {
        return str1 + str2;
    } else {
        return str1;
    }
}
concat("a", 0); //a"
concat("a", 1); //"a1"

該方法的目的是當(dāng)?shù)诙€(gè)參數(shù)存在的時(shí)候返回兩個(gè)字符串拼接結(jié)果;

當(dāng)?shù)诙€(gè)參數(shù)不存在的時(shí)候直接返回第一個(gè)參數(shù).可是除了undefined會(huì)轉(zhuǎn)換為布爾值false外, 0 也會(huì)轉(zhuǎn)換為false, 而1則轉(zhuǎn)換為true.因此調(diào)用結(jié)果與本意不太一致.

改進(jìn):

function concat(str1, str2) {
    if (typeof str2 == "string") {
        return str1 + str2;
    } else {
        return str1;
    }
}
concat("a", 0); //a"
concat("a", 1); //"a"
數(shù)據(jù)類(lèi)型錯(cuò)誤

在JavaScript中, 使用變量和函數(shù)參數(shù)之前是不會(huì)自動(dòng)進(jìn)行類(lèi)型檢驗(yàn)的.因此需要開(kāi)發(fā)人員自己編寫(xiě)數(shù)據(jù)類(lèi)型檢測(cè)的代碼.例如:

function reverseSort(values) {
    if (values) { //這里的判斷不能保證是數(shù)組類(lèi)型
        values.sort();
        values.reverse();
    }

    console.log(values);
}
reverseSort("a"); //TypeError

這里如果傳入的參數(shù)不是數(shù)組類(lèi)型, 就會(huì)發(fā)生數(shù)據(jù)類(lèi)型錯(cuò)誤.一般來(lái)說(shuō), 對(duì)于基本類(lèi)型使用typeof進(jìn)行類(lèi)型檢驗(yàn), 對(duì)于對(duì)象類(lèi)型使用instanceof進(jìn)行類(lèi)型檢驗(yàn).

function reverseSort(values) {
    if (values instanceof Array) {
        values.sort();
        values.reverse();
    }
    console.log(values);
}
reverseSort("a"); //a"
reverseSort([6, 2, 3, 8, 1, 5]); //[8, 6, 5, 3, 2, 1]
通信錯(cuò)誤

場(chǎng)景一是在將數(shù)據(jù)發(fā)送給服務(wù)器之前, 未使用encodeURIComponent() 對(duì)數(shù)據(jù)進(jìn)行編碼.例如:

www.cnblogs.com ? backurl = http : //www.cnblogs.com?a=1

解決方法是使用encodeURIComponent() 對(duì)backurl后面的參數(shù)進(jìn)行編碼, 結(jié)果為:

www.cnblogs.com ? backurl = http % 3 A % 2 F % 2 Fwww.cnblogs.com % 3 Fa % 3 D1

場(chǎng)景二是對(duì)于查詢(xún)字符串, 也要對(duì)于查詢(xún)參數(shù)的名和值都進(jìn)行編碼.

把錯(cuò)誤記錄到服務(wù)器

如果把前后端的錯(cuò)誤信息集中進(jìn)行匯總記錄, 能極大的方便對(duì)數(shù)據(jù)庫(kù)錯(cuò)誤日志的分析.要把JavaScrpt錯(cuò)誤記錄到服務(wù)器需要借助image控件進(jìn)行, 因?yàn)樗袨g覽器都支持image對(duì)象, 而且可以避免跨域限制.

首先新建一個(gè)服務(wù)端頁(yè)面用于處理錯(cuò)誤數(shù)據(jù).這個(gè)頁(yè)面從查詢(xún)字符串中獲取錯(cuò)誤數(shù)據(jù), 然后將數(shù)據(jù)寫(xiě)入到錯(cuò)誤日志中, 例如該頁(yè)面為a.ashx.

然后在調(diào)用頁(yè)面中, 創(chuàng)建image對(duì)象, 并且為其src屬性賦值, 這樣就可以將錯(cuò)誤信息發(fā)送到服務(wù)端頁(yè)面了.

function logError(msg) {
    var img = new Image();
    img.src = "a.ashx?msg=" + encodeURIComponent(msg);
}

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/78683.html

相關(guān)文章

  • JavaScript 錯(cuò)誤處理調(diào)試——“調(diào)試技術(shù)常見(jiàn)IE錯(cuò)誤注意要點(diǎn)

    摘要:將消息記錄到控制臺(tái)和來(lái)說(shuō),可通過(guò)對(duì)象向控制臺(tái)中寫(xiě)入消息。如常見(jiàn)的錯(cuò)誤操作終止無(wú)效字符未找到成員未知運(yùn)行時(shí)錯(cuò)誤語(yǔ)法錯(cuò)誤系統(tǒng)無(wú)法找到指定資源 將消息記錄到控制臺(tái) console IE8、Firefox、Chrome和Safari來(lái)說(shuō),可通過(guò)console對(duì)象向JavaScript控制臺(tái)中寫(xiě)入消息。對(duì)象有下列方法: error(message):將錯(cuò)誤消息記錄到控制臺(tái) info(messa...

    GT 評(píng)論0 收藏0
  • JavaScript錯(cuò)誤正確處理方式,你用對(duì)了嗎?

    摘要:?jiǎn)卧獪y(cè)試會(huì)體現(xiàn)出以上錯(cuò)誤處理程序的作用如果出現(xiàn)問(wèn)題,錯(cuò)誤處理程序就會(huì)返回。同時(shí)錯(cuò)誤會(huì)展開(kāi)堆棧,這對(duì)調(diào)試非常有幫助。展開(kāi)堆棧處理異常的一種方式是在調(diào)用堆棧的頂部加入。確保你的錯(cuò)誤處理處在相同域中,這樣會(huì)保留原始消息,堆棧和自定義錯(cuò)誤對(duì)象。 JavaScript的事件驅(qū)動(dòng)范式增添了豐富的語(yǔ)言,也是讓使用JavaScript編程變得更加多樣化。如果將瀏覽器設(shè)想為JavaScript的事件驅(qū)動(dòng)...

    chaos_G 評(píng)論0 收藏0
  • JavaScript 編程精解 中文第三版 八、Bug 和錯(cuò)誤

    摘要:幸運(yùn)的是,使用符號(hào)創(chuàng)建的構(gòu)造器,如果在不使用來(lái)調(diào)用,則始終會(huì)報(bào)錯(cuò),即使在非嚴(yán)格模式下也不會(huì)產(chǎn)生問(wèn)題。 來(lái)源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項(xiàng)目原文:Bugs and Errors 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《JavaScript 編程精解(第 2 版)》 調(diào)試的難度是開(kāi)始編寫(xiě)代碼的兩倍。 因此,如...

    wujl596 評(píng)論0 收藏0
  • 【全文】狼叔:如何正確學(xué)習(xí)Node.js

    摘要:感謝大神的免費(fèi)的計(jì)算機(jī)編程類(lèi)中文書(shū)籍收錄并推薦地址,以后在倉(cāng)庫(kù)里更新地址,聲音版全文狼叔如何正確的學(xué)習(xí)簡(jiǎn)介現(xiàn)在,越來(lái)越多的科技公司和開(kāi)發(fā)者開(kāi)始使用開(kāi)發(fā)各種應(yīng)用。 說(shuō)明 2017-12-14 我發(fā)了一篇文章《沒(méi)用過(guò)Node.js,就別瞎逼逼》是因?yàn)橛腥嗽谥跎虾贜ode.js。那篇文章的反響還是相當(dāng)不錯(cuò)的,甚至連著名的hax賀老都很認(rèn)同,下班時(shí)讀那篇文章,竟然坐車(chē)的還坐過(guò)站了。大家可以很...

    Edison 評(píng)論0 收藏0
  • 【全文】狼叔:如何正確學(xué)習(xí)Node.js

    摘要:感謝大神的免費(fèi)的計(jì)算機(jī)編程類(lèi)中文書(shū)籍收錄并推薦地址,以后在倉(cāng)庫(kù)里更新地址,聲音版全文狼叔如何正確的學(xué)習(xí)簡(jiǎn)介現(xiàn)在,越來(lái)越多的科技公司和開(kāi)發(fā)者開(kāi)始使用開(kāi)發(fā)各種應(yīng)用。 說(shuō)明 2017-12-14 我發(fā)了一篇文章《沒(méi)用過(guò)Node.js,就別瞎逼逼》是因?yàn)橛腥嗽谥跎虾贜ode.js。那篇文章的反響還是相當(dāng)不錯(cuò)的,甚至連著名的hax賀老都很認(rèn)同,下班時(shí)讀那篇文章,竟然坐車(chē)的還坐過(guò)站了。大家可以很...

    fengxiuping 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<