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