錯(cuò)誤處理
try-catch
try{
//可能出錯(cuò)的代碼
asdfjsald
} catch(error){
alert("errrrror");
alert(error.message);
}
finally子句
finally子句一旦使用说订,其代碼無論如何都會(huì)執(zhí)行愚屁。
真的是無論如何都會(huì)執(zhí)行,就算之前的try-catch中有return語(yǔ)句奸笤。
function testFinally(){
try {
return 2;
} catch (error){
return 1;
} finally {
return 0;
}
}
只要有finally,try和catch中的return都會(huì)被忽略
finally有的話哼鬓,catch語(yǔ)句可以沒有监右。
錯(cuò)誤類型
Error
EvalError
RangeError
ReferenceError
SyntaxError
TypeError
URIError
拋出錯(cuò)誤
與try-catch相配的還有一個(gè)throw操作符。拋出錯(cuò)誤時(shí)要指出一個(gè)值用于拋出自定義錯(cuò)誤异希,這個(gè)值是什么類型都可以健盒。
throw 12345;
throw "Hello world!";
throw true;
throw { name: "JavaScript"};
在遇到throw時(shí),代碼會(huì)立刻停止執(zhí)行称簿,僅當(dāng)有try-catch捕獲時(shí)代碼才會(huì)繼續(xù)運(yùn)行扣癣。
throw new Error("Something bad happened.");
拋出錯(cuò)誤的時(shí)機(jī)
瀏覽器對(duì)錯(cuò)誤的解釋可能很模糊,對(duì)于大型的應(yīng)用憨降,拋出你自己的錯(cuò)誤對(duì)查找問題的根源很有幫助父虑。
function process(values){
if (!(values instanceof Array)){
throw new Error("process(): Argument must be an array.");
}
values.sort();
}
常見錯(cuò)誤類型
類型轉(zhuǎn)換錯(cuò)誤
這里第三個(gè)參數(shù)是可選的,但是像第一個(gè)例子這樣檢測(cè)并不合適
function concat(str1, str2, str3){
var result = str1 + str2;
if (str3){ // 不要這樣 !!!
result += str3;
}
return result;
}
function concat(str1, str2, str3){
var result = str1 + str2;
if (typeof str3 == "string"){
result += str3;
}
return result;
}
數(shù)據(jù)類型錯(cuò)誤
function reverseSort(values){
//if (values != null)
//if (typeof values.sort == "function")
//if (values){
//上面的檢測(cè)都不靠譜
if (values instanceof Array){
values.sort();
values.reverse();
}
}
通信錯(cuò)誤
URL構(gòu)建錯(cuò)誤
使用一個(gè)函數(shù)來添加參數(shù)
function addQueryStringArg(url, name, value){
if (url.indexOf("?") == -1){
url += "?";
} else {
url += "&";
}
url += encodeURIComponent(name) + "=" + encodeURIComponent(value);
return url;
}
把錯(cuò)誤記錄到服務(wù)器
使用Image對(duì)象巧妙的將錯(cuò)誤記錄
function logError(sev, msg){
var img = new Image();
img.src = "log.php?sev=" + encodeURIComponent(sev) + "&msg=" +
encodeURIComponent(msg);
}