摘要:使用函數(shù)發(fā)生異常時拋出。數(shù)值超出相應(yīng)范圍時拋出。拋出錯誤與相配的還有一個操作符,用于拋出自定義錯誤。錯誤事件沒有通過處理的錯誤都會觸發(fā)對象的事件。任何瀏覽器中,事件處理程序都不會創(chuàng)建對象,但它可以接受個參數(shù)錯誤消息錯誤所在的和行號。
try-catch語句
該語句最適合處理那些我們無法控制的錯誤,在明明白白地知道自己的代碼會發(fā)生錯誤時,再使用該語句就不太合適了。
ECMA-262第3版引入了try-catch語句,基本的語法如下所示:
try { // statements } catch(e) { // statements console.log(e); }
即使不使用這個錯誤對象,也要起個名字,對象中包含的實際信息因瀏覽器而異,但共同的是一個保存錯誤消息的
message屬性,ECMA-262還規(guī)定了一個保存錯誤類型的
name屬性
所有瀏覽器都支持這個屬性(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)用,無論如何都會執(zhí)行,甚至return語句都不會阻止,例如:
function test() { try { return 1; } catch (error) { return 2; } finally { return 3; } }
上述代碼返回3,當(dāng)try中代碼正常執(zhí)行,finally會執(zhí)行;當(dāng)try中代碼出現(xiàn)錯誤,catch代碼會執(zhí)行,finally代碼也會執(zhí)行。
錯誤類型每種錯誤都有對應(yīng)的錯誤類型,而當(dāng)錯誤發(fā)生時,就會拋出相應(yīng)類型的錯誤對象,ECMA-262定義了7種錯誤類型:
* `Error`: 基類型。 * `EvalError`: 使用eval()函數(shù)發(fā)生異常時拋出。 * `RangeError`: 數(shù)值超出相應(yīng)范圍時拋出。 * `ReferenceError`: 找不到對象時拋出。 * `SyntaxError`: 使用eval()函數(shù)中的字符串有語法錯誤時拋出。 * `TypeError`: 在變量中保存意外類型或訪問不存在的方法時拋出。 * `URIError`: 使用encodeURI或decodeURI()中URI格式不正確時拋出。拋出錯誤
與try-catch相配的還有一個
throw操作符,用于拋出自定義錯誤。
拋出錯誤時,必須給throw操作符指定一個值,這個值的類型沒有要求,例如:
throw 123; throw "Hello World!";
在遇到throw操作符時,代碼會立即停止執(zhí)行。
通過使用某種內(nèi)置錯誤類型,可以更真實
如:
try { throw new Error("nooo"); } catch (e) { console.log(e.message); //nooo console.log(e.name); //Error }
或:
throw new SyntaxError("wwwwtttttfffff");
也可以創(chuàng)建自定義錯誤類型:
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 }
捕獲錯誤的目的在于避免瀏覽器以默認(rèn)方式處理它們;而拋出錯誤的目的在于提供錯誤發(fā)生具體原因的消息。
錯誤(error)事件沒有通過try-catch處理的錯誤都會觸發(fā)window對象的
error事件。任何瀏覽器中,onerror事件處理程序都不會創(chuàng)建event對象,但它可以接受3個參數(shù):錯誤消息、錯誤所在的URL和行號。
只要發(fā)生錯誤,無論是不是瀏覽器生成的,都會觸發(fā)error事件,并執(zhí)行這個事件處理程序,如果在事件處理程序中返回false,可以阻止瀏覽器報告錯誤的默認(rèn)行為,例如:
throw new Error("hello there"); window.onerror = function() { console.log(message); //Uncaught Error: hello there return false; }
圖像也支持error事件,只要圖像的src屬性中的URL不能返回可以被識別的圖像格式,就會觸發(fā)error事件。
var x = new Image(); x.onerror = function () { console.log("message"); //message }; x.src = "fds.png";常見的錯誤類型
常見的三種錯誤類型為:
類型轉(zhuǎn)換錯誤
數(shù)據(jù)類型錯誤
通信錯誤
類型轉(zhuǎn)換錯誤類型轉(zhuǎn)換錯誤常發(fā)生在使用某個操作符或者自動轉(zhuǎn)換數(shù)據(jù)類型的場景
第一種常見錯誤是使用相等和不等操作符
console.log(1 == "1"); //true console.log(1 == true); //true
改進(jìn): 推薦使用全等( === ) 和非全等( !== ) 操作符, 來避免發(fā)生因為使用相等和不等操作符時引發(fā)的類型轉(zhuǎn)換錯誤;
console.log(1 === "1"); //false console.log(1 === true); //false
第二種常見錯誤是在流控制語句中使用非布爾值.
function concat(str1, str2) { if (str2) { return str1 + str2; } else { return str1; } } concat("a", 0); //a" concat("a", 1); //"a1"
該方法的目的是當(dāng)?shù)诙€參數(shù)存在的時候返回兩個字符串拼接結(jié)果;
當(dāng)?shù)诙€參數(shù)不存在的時候直接返回第一個參數(shù).可是除了undefined會轉(zhuǎn)換為布爾值false外, 0 也會轉(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ù)類型錯誤
在JavaScript中, 使用變量和函數(shù)參數(shù)之前是不會自動進(jìn)行類型檢驗的.因此需要開發(fā)人員自己編寫數(shù)據(jù)類型檢測的代碼.例如:
function reverseSort(values) { if (values) { //這里的判斷不能保證是數(shù)組類型 values.sort(); values.reverse(); } console.log(values); } reverseSort("a"); //TypeError
這里如果傳入的參數(shù)不是數(shù)組類型, 就會發(fā)生數(shù)據(jù)類型錯誤.一般來說, 對于基本類型使用typeof進(jìn)行類型檢驗, 對于對象類型使用instanceof進(jì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]通信錯誤
場景一是在將數(shù)據(jù)發(fā)送給服務(wù)器之前, 未使用encodeURIComponent() 對數(shù)據(jù)進(jìn)行編碼.例如:
www.cnblogs.com ? backurl = http : //www.cnblogs.com?a=1
解決方法是使用encodeURIComponent() 對backurl后面的參數(shù)進(jìn)行編碼, 結(jié)果為:
www.cnblogs.com ? backurl = http % 3 A % 2 F % 2 Fwww.cnblogs.com % 3 Fa % 3 D1
場景二是對于查詢字符串, 也要對于查詢參數(shù)的名和值都進(jìn)行編碼.
把錯誤記錄到服務(wù)器如果把前后端的錯誤信息集中進(jìn)行匯總記錄, 能極大的方便對數(shù)據(jù)庫錯誤日志的分析.要把JavaScrpt錯誤記錄到服務(wù)器需要借助image控件進(jìn)行, 因為所有瀏覽器都支持image對象, 而且可以避免跨域限制.
首先新建一個服務(wù)端頁面用于處理錯誤數(shù)據(jù).這個頁面從查詢字符串中獲取錯誤數(shù)據(jù), 然后將數(shù)據(jù)寫入到錯誤日志中, 例如該頁面為a.ashx.
然后在調(diào)用頁面中, 創(chuàng)建image對象, 并且為其src屬性賦值, 這樣就可以將錯誤信息發(fā)送到服務(wù)端頁面了.
function logError(msg) { var img = new Image(); img.src = "a.ashx?msg=" + encodeURIComponent(msg); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/78683.html
摘要:將消息記錄到控制臺和來說,可通過對象向控制臺中寫入消息。如常見的錯誤操作終止無效字符未找到成員未知運行時錯誤語法錯誤系統(tǒng)無法找到指定資源 將消息記錄到控制臺 console IE8、Firefox、Chrome和Safari來說,可通過console對象向JavaScript控制臺中寫入消息。對象有下列方法: error(message):將錯誤消息記錄到控制臺 info(messa...
摘要:單元測試會體現(xiàn)出以上錯誤處理程序的作用如果出現(xiàn)問題,錯誤處理程序就會返回。同時錯誤會展開堆棧,這對調(diào)試非常有幫助。展開堆棧處理異常的一種方式是在調(diào)用堆棧的頂部加入。確保你的錯誤處理處在相同域中,這樣會保留原始消息,堆棧和自定義錯誤對象。 JavaScript的事件驅(qū)動范式增添了豐富的語言,也是讓使用JavaScript編程變得更加多樣化。如果將瀏覽器設(shè)想為JavaScript的事件驅(qū)動...
摘要:幸運的是,使用符號創(chuàng)建的構(gòu)造器,如果在不使用來調(diào)用,則始終會報錯,即使在非嚴(yán)格模式下也不會產(chǎn)生問題。 來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項目原文:Bugs and Errors 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 自豪地采用谷歌翻譯 部分參考了《JavaScript 編程精解(第 2 版)》 調(diào)試的難度是開始編寫代碼的兩倍。 因此,如...
摘要:感謝大神的免費的計算機(jī)編程類中文書籍收錄并推薦地址,以后在倉庫里更新地址,聲音版全文狼叔如何正確的學(xué)習(xí)簡介現(xiàn)在,越來越多的科技公司和開發(fā)者開始使用開發(fā)各種應(yīng)用。 說明 2017-12-14 我發(fā)了一篇文章《沒用過Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當(dāng)不錯的,甚至連著名的hax賀老都很認(rèn)同,下班時讀那篇文章,竟然坐車的還坐過站了。大家可以很...
摘要:感謝大神的免費的計算機(jī)編程類中文書籍收錄并推薦地址,以后在倉庫里更新地址,聲音版全文狼叔如何正確的學(xué)習(xí)簡介現(xiàn)在,越來越多的科技公司和開發(fā)者開始使用開發(fā)各種應(yīng)用。 說明 2017-12-14 我發(fā)了一篇文章《沒用過Node.js,就別瞎逼逼》是因為有人在知乎上黑Node.js。那篇文章的反響還是相當(dāng)不錯的,甚至連著名的hax賀老都很認(rèn)同,下班時讀那篇文章,竟然坐車的還坐過站了。大家可以很...
閱讀 811·2023-04-25 20:18
閱讀 2092·2021-11-22 13:54
閱讀 2527·2021-09-26 09:55
閱讀 3857·2021-09-22 15:28
閱讀 2969·2021-09-03 10:34
閱讀 1710·2021-07-28 00:15
閱讀 1629·2019-08-30 14:25
閱讀 1281·2019-08-29 17:16