錯(cuò)誤處理與調(diào)試 錯(cuò)誤處理 try-catch語句
try{ //可能會(huì)導(dǎo)致錯(cuò)誤的代碼 }catch(error){ //在錯(cuò)誤發(fā)生時(shí)怎么處理 }
發(fā)生錯(cuò)誤時(shí)可以顯示瀏覽器給出的信息
try{ window.someNonexistentFunction(); }catch(error){ alert(error.message); }
在try-catch語句中是可選的,但finally子句一經(jīng)使用,代碼無論如何都會(huì)執(zhí)行,try語句塊中的代碼全部正常執(zhí)行,finally子句會(huì)執(zhí)行,如果因?yàn)槌鲥e(cuò)而執(zhí)行了catch語句塊,finally子句照樣還會(huì)執(zhí)行。只要代碼中包含finally子句,無論try或catch語句塊中包含什么代碼,甚至return語句,都不會(huì)阻止finally子句的執(zhí)行
function testFinally(){ try{ return 2; }catch(error){ return 1; }finally { return 0; } }
ECMA-262定義了7種錯(cuò)誤類型
Error,是基類型,其他錯(cuò)誤類型都繼承自該類型
EvalError,錯(cuò)誤會(huì)在使用eval()函數(shù)而發(fā)生異常時(shí)被拋出
new eval();//拋出EvalError eval=foo;//拋出EvalError
RangeError,在數(shù)值超出相應(yīng)范圍時(shí)觸發(fā)
var items1=new Array(-20);//拋出RangeError var items2=new Array(Number.MAX_VALUE);//拋出RangeError
ReferenceError,找不到對(duì)象時(shí),拋出這個(gè)錯(cuò)誤
var obj=x;//在x并未聲明的情況下拋出ReferenceError
SyntaxError,把語法錯(cuò)誤的JavaScript傳入eval()函數(shù)時(shí)觸發(fā)
eval("a++b");//拋出SyntaxError
TypeError,在變量中保存著意外的類型,或者訪問不存在的方式時(shí)觸發(fā)
var o=new 10;//拋出TypeError alert("name" in true);//拋出TypeError Function.prototype.toString.call("name");//拋出TypeError
URIError,使用encodeURI()或decodeURI()而URI格式不正確時(shí)觸發(fā)
拋出錯(cuò)誤
與try-catch語句相配的還有一個(gè)throw操作符,用于隨時(shí)拋出自定義錯(cuò)誤。拋出錯(cuò)誤時(shí),必須要給throw操作符指定一個(gè)值,這個(gè)值是什么類型。沒有要求
throw 12345; throw "Hello world!"; throw true; throw {name:"JavaScript"};
也可以模擬出類似的瀏覽器錯(cuò)誤
throw new SyntaxError("I don’t like your syntax."); throw new TypeError("What type of variable do you take me for?"); throw new RangeError("Sorry, you just don’t have the range."); throw new EvalError("That doesn’t evaluate."); throw new URIError("Uri, is that you?"); throw new ReferenceError("You didn’t cite your references properly.");
拋出錯(cuò)誤的時(shí)機(jī)
//函數(shù)會(huì)在參數(shù)不是數(shù)組的情況下失敗 function process(values){ value.sort(); for(var i=0,len=values.length;i100){ return values[i]; } } return -1; }
以上代碼,不同瀏覽器給出不同錯(cuò)誤信息
IE,屬性或方法不存在
Firefox,values.sort()不是函數(shù)
Safari,值undefined
Chrome,對(duì)象名沒有方法sort
Opera,類型不匹配
//函數(shù)重寫 function process(values){ if (!(values instanceof Array)){ throw new Error("process(): Argument must be an array."); } values.sort(); for (var i=0, len=values.length; i < len; i++){ if (values[i] > 100){ return values[i]; } } return -1; }
重寫后的函數(shù)中,如果values參數(shù)不是數(shù)組,就會(huì)拋出一個(gè)錯(cuò)誤,錯(cuò)誤消息中包含了函數(shù)的名稱,以及為什么會(huì)發(fā)生錯(cuò)誤的明確描述
錯(cuò)誤(error)事件任何沒有通過try-catch處理的錯(cuò)誤都會(huì)觸發(fā)window對(duì)象的error事件
在任何Web瀏覽器中,onerror事件處理程序都不會(huì)創(chuàng)建event對(duì)象,但可以接收三個(gè)參數(shù):錯(cuò)誤消息,錯(cuò)誤所在的URL和行號(hào)
只要發(fā)生錯(cuò)誤,無論是不是瀏覽器生成的,都會(huì)觸發(fā)error事件,并執(zhí)行這個(gè)事件處理程序
在事件處理程序中返回false可以阻止瀏覽器報(bào)告錯(cuò)誤的默認(rèn)行為
window.onerror=function(message,url,line){ alert(message); return false; }常見錯(cuò)誤類型
一般需要關(guān)注三種錯(cuò)誤
類型轉(zhuǎn)換錯(cuò)誤
數(shù)據(jù)類型錯(cuò)誤
通信錯(cuò)誤
區(qū)分致命錯(cuò)誤和非致命錯(cuò)誤
非致命錯(cuò)誤
不影響用戶的主要任務(wù)
只影響頁面的一部分
可以恢復(fù)
重復(fù)相同的操作可以消除錯(cuò)誤
致命錯(cuò)誤
應(yīng)用程序根本無法繼續(xù)運(yùn)行
錯(cuò)誤明顯影響到了用戶的主要操作
會(huì)導(dǎo)致其他連帶錯(cuò)誤
把錯(cuò)誤記錄到服務(wù)器for(var i=0,len=mods.length;i調(diào)試技術(shù) 將消息記錄到控制臺(tái)
可以通過console對(duì)象向JavaScript控制臺(tái)中寫入信息,這個(gè)對(duì)象具有下列方法
error(message),將錯(cuò)誤信息記錄到控制臺(tái)
info(message),將信息性消息記錄到控制臺(tái)
log(message),將一般消息記錄到控制臺(tái)
warn(message),將警告消息記錄到控制臺(tái)
function sum(num1, num2){ console.log("Entering sum(), arguments are " + num1 + "," + num2); console.log("Before calculation"); var result = num1 + num2; console.log("After calculation"); console.log("Exiting sum()"); return result; }將消息記錄到當(dāng)前頁面
在頁面 中開辟一小塊區(qū)域,用以顯示信息,這個(gè)區(qū)域通常是一個(gè)元素,而該元素可以總是出現(xiàn)在頁面中,但僅用于調(diào)試目的,也可以是一個(gè)根據(jù)需要?jiǎng)討B(tài)創(chuàng)建的元素
function log(message){ var console = document.getElementById("debuginfo"); if (console === null){ console = document.createElement("div"); console.id = "debuginfo"; console.style.background = "#dedede"; console.style.border = "1px solid silver"; console.style.padding = "5px"; console.style.width = "400px"; console.style.position = "absolute"; console.style.right = "0px"; console.style.top = "0px"; document.body.appendChild(console); } console.innerHTML += "拋出錯(cuò)誤" + message + "
"; }
可以使用assert()函數(shù)代替某些函數(shù)中需要調(diào)試的if語句,以便輸出錯(cuò)誤消息
function assert(condition, message){ if (!condition){ throw new Error(message); } } function divide(num1, num2){ assert(typeof num1 == "number" && typeof num2 == "number", "divide(): Both arguments must be numbers."); return num1 / num2; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/97969.html
摘要:在基于使用命名空間的文檔求值時(shí),需要使用對(duì)象。第四個(gè)參數(shù)的取值類型是下列常量之一,返回與表達(dá)式匹配的數(shù)據(jù)類型。,返回字符串值。這是最常用的結(jié)果類型。集合中節(jié)點(diǎn)的次序與它們?cè)谖臋n中的次序一致。 JavaScript與XML 瀏覽器對(duì)XML DOM的支持 DOM2級(jí)核心 在通過JavaScript處理XML時(shí),通常只使用參數(shù)root,因?yàn)檫@個(gè)參數(shù)指定的是XML DOM文檔元素的標(biāo)簽名 v...
摘要:基本概念語法區(qū)分大小寫,中的一切變量函數(shù)名和操作符都區(qū)分大小寫。要將一個(gè)值轉(zhuǎn)換成對(duì)應(yīng)的值,可以調(diào)用類型包括整數(shù)和浮點(diǎn)數(shù)值,基本數(shù)值字面量格式是十進(jìn)制整數(shù),除了十進(jìn)制外還有八進(jìn)制十六進(jìn)制。八進(jìn)制第一位必須是,十六進(jìn)制第一位必須是。 基本概念 語法 區(qū)分大小寫,ECMAScript中的一切(變量、函數(shù)名和操作符)都區(qū)分大小寫。函數(shù)名不能使用typeof,因?yàn)樗且粋€(gè)關(guān)鍵字,但typeOf...
摘要:操作類名時(shí)可以通過屬性添加刪除和替換類名。如果將可選的參數(shù)設(shè)置為,則表示盡量將元素顯示在視口中部垂直方向。將元素的內(nèi)容滾動(dòng)指定的頁面高度,具體高度由元素的高度決定。 DOM擴(kuò)展 選擇符API querySelector()方法 querySelector()方法接收一個(gè)CSS選擇符,返回與該模式匹配的第一個(gè)元素,如果沒有找到匹配的元素,返回null //取得body元素 var b...
摘要:也就是說避免屬性查找或其他的操作。簡(jiǎn)化循環(huán)體循環(huán)體是執(zhí)行最多的,所以要確保其被最大限度地優(yōu)化。代碼組織組織代碼要考慮到可維護(hù)性并不一定是傳送給瀏覽器的最好方式。 最佳實(shí)踐 可維護(hù)性 什么是可維護(hù)性的代碼 如果說代碼是可維護(hù)的,它需要遵循以下特點(diǎn) 可理解性——其他人可以接手代碼并理解它的意圖和一般途徑,而無需原開發(fā)人員的完整解釋。 直觀性——代碼中的東西一看就能明白,不管其操作過程多...
摘要:對(duì)象的核心對(duì)象是,它表示瀏覽器的一個(gè)實(shí)例。而和則表示該容器中頁面視圖區(qū)的大小。在中,與返回相同的值,即視口大小而非瀏覽器窗口大小。第三個(gè)參數(shù)是一個(gè)逗號(hào)分隔的設(shè)置字符串,表示在新窗口中都顯示哪些特性。這應(yīng)該是用戶打開窗口后的第一個(gè)頁面 BOM window對(duì)象 BOM的核心對(duì)象是window,它表示瀏覽器的一個(gè)實(shí)例。在瀏覽器中,window對(duì)象有雙重角色,它既是通過JavaScript訪...
閱讀 959·2019-08-30 14:24
閱讀 998·2019-08-30 14:13
閱讀 1804·2019-08-29 17:21
閱讀 2690·2019-08-29 13:44
閱讀 1665·2019-08-29 11:04
閱讀 449·2019-08-26 10:44
閱讀 2571·2019-08-23 14:04
閱讀 914·2019-08-23 12:08