3. 錯(cuò)誤和調(diào)試
1. 錯(cuò)誤處理
任何成熟的編程都必須處理錯(cuò)誤信息
try {
// 可能導(dǎo)致錯(cuò)誤的代碼
} catch (e) {
// 在錯(cuò)誤發(fā)生時(shí)執(zhí)行
} finally {
// 最后執(zhí)行
}
注意:
1. finally可選
2. 無論**try/catch**執(zhí)行哪塊涩赢,此處finally都將執(zhí)行茵休,即使有return語句
3. 合理使用try-catch:**適合處理我們無法控制的錯(cuò)誤**(引用第三方規(guī)范的庫)
2. 錯(cuò)誤類型
-
Error
- 基本類型嘲碱,其他錯(cuò)誤類型都繼承該類型
- Error錯(cuò)誤很少見煌茬,如果有累奈,一般都是瀏覽器拋出
EvalError:使用eval()函數(shù)而發(fā)生異常時(shí)被拋出(少見贬派,不推薦使用eval)
-
RangeError:在數(shù)值超出相應(yīng)范圍時(shí)觸發(fā)
var arr = new Array(-20); var arr = new Array(Number.MAX_VALUE);
-
ReferenceError
- 訪問不存在的變量
console.log(title)
- 找不到對(duì)象
console.log(obj.title);
SyntaxError:直接導(dǎo)致JavaScript代碼立即停止執(zhí)行。
-
TypeError:執(zhí)行特定于類型的操作時(shí)澎媒,變量的類型不符合要求
- 在變量中保存意外的類型
- 訪問不存在方法
var o = new 10; alert('name' in true); Function.call('name')
URIError:使用encodeURI()/decodeURI()的時(shí)候搞乏,格式不正確,導(dǎo)致該錯(cuò)誤戒努,但概率很低
3. 拋出錯(cuò)誤
關(guān)鍵字 throw 拋出錯(cuò)誤请敦,遇到throw操作符,代碼會(huì)立即停止執(zhí)行(除非遇到try-catch捕獲储玫,代碼才可以執(zhí)行)
- 拋出錯(cuò)誤
throw 123456;
throw 'hello world';
throw true;
throw { name: 'hello world' };
- 拋出上面錯(cuò)誤類型中的某種
throw new Error('something is wrong');
throw new TypeError('something is wrong');
throw new RangeError('something is wrong');
throw new ReferenceError('something is wrong');
...
- 自定義錯(cuò)誤
function CustomError(message) {
this.name = 'custom error';
this.message = message;
}
CustomError.prototype = new Error();
throw new CustomError('something is wrong');
4. 錯(cuò)誤事件
任何沒有通過try-catch處理的錯(cuò)誤都會(huì)觸發(fā)window對(duì)象的error事件(DOM0標(biāo)準(zhǔn))
5. 常見的錯(cuò)誤類型
-
類型轉(zhuǎn)換錯(cuò)誤
// 用 === 5 == '5' // true 5 === '5' // false // str3隱性轉(zhuǎn)為布爾值侍筛,如果str3位'', 0, false等值,則結(jié)果不可預(yù)料 function concat (str1, str2, str3) { var result = str1 + str2; if (str3) { result += str3; } return result; }
-
數(shù)據(jù)類型錯(cuò)誤
// 任何非字符串值都會(huì)導(dǎo)致錯(cuò)誤 function getQueryString (url) { var pos = url.indexOf('?'); if (pos > -1) { return url.substring(pos + 1); } return ''; } // 更恰當(dāng) function getQueryString (url) { // 增加對(duì)參數(shù)類型判斷撒穷,增加容錯(cuò)能力 if (typeof url === 'string') { var pos = url.indexOf('?'); if (pos > -1) { return url.substring(pos + 1); } } return ''; }
function reverseSort (values) { if (values) { // 不要這樣O灰!端礼! values.sort(); values.reverse(); } } function reverseSort (values) { if (values != null) { // 不要這樣G菪Α!齐媒! values.sort(); values.reverse(); } } function reverseSort (values) { if (typeof value.sort == 'function') { // 不要這樣F衙俊!喻括! values.sort(); values.reverse(); } } function reverseSort (values) { if (values instanceof Array) { // 最合適 values.sort(); values.reverse(); } }
通信錯(cuò)誤:主要是Ajax錯(cuò)誤和URL/發(fā)送數(shù)據(jù)有關(guān)(后期補(bǔ)充邀杏。。唬血。)
6. 調(diào)試代碼
-
在控制欄直接打印信息
console.log(title); // 打印普通變量 console.dir(obj); // 打印對(duì)象結(jié)構(gòu) console.table(list); // 打印list類數(shù)組對(duì)象 console.assert(); // 判斷第一個(gè)參數(shù)是否為真望蜡,false的話拋出異常并且在控制臺(tái)輸出相應(yīng)的信息 console.clear(); // 清空控制臺(tái) console.error(); // 打印錯(cuò)誤信息 console.warn(); // 打印警告信息 // 你可以啟動(dòng)一個(gè)計(jì)時(shí)器(timer)來跟蹤某一個(gè)操作的占用時(shí)長(zhǎng)。每一個(gè)計(jì)時(shí)器必須擁有唯一的名字拷恨,頁面中最多能同時(shí)運(yùn)行10,000個(gè)計(jì)時(shí)器脖律。當(dāng)以此計(jì)時(shí)器名字為參數(shù)調(diào)用 console.timeEnd() 時(shí),瀏覽器將以毫秒為單位腕侄,輸出對(duì)應(yīng)計(jì)時(shí)器所經(jīng)過的時(shí)間. console.time(timeName); // 需要停止的計(jì)時(shí)器名字小泉。一旦停止芦疏,計(jì)時(shí)器所經(jīng)過的時(shí)間會(huì)被自動(dòng)輸出到控制臺(tái)。 console.timeEnd(timeName);
-
debugger
debugger 語句調(diào)用任何可用的調(diào)試功能微姊,例如設(shè)置斷點(diǎn)酸茴。 如果沒有調(diào)試功能可用,則此語句不起作用
debugger;