1.try-catch語句
try{ //可能會導致錯誤的代碼
}catch(error){ //在發生錯誤時怎麼處理
//alert(error.message);
//alert(error.name),例如TypeError
}
與其他語言不同,即使你不想使用這個錯誤對象,也要給它起個名字
message屬性是所有瀏覽器都支持的屬性,它保存着錯誤消息
finally子句
function testFinally(){
try {
return 2;
} catch (error){
return 1;
} finally {
return 0;
}
}
function testWithoutFinally(){
try {
return 2;
} catch (error){
return 1;
}
}
alert(testFinally());
alert(testWithoutFinally());
只要代碼中包含finally子句,則無論try或catch語句塊中包含什麼代碼----甚至return語句,也不會阻止finally子句的執行
2.錯誤類型
Error:這個基類型的主要目的是供開發人員拋出自定義錯誤
ReferenceError:通常在訪問不存在的變量時,就會發生這種錯誤
SyntaxError:顧名思義
TypeError:在變量中保存着意外的類型時,或者在訪問不存在的方法。歸根到底還是由於在執行特定於類型的操作時,變量的類型並不符合要求所致。
合理使用try-catch:使用try-catch最適合那些我們無法控制的錯誤。在大型項目中,我們不能修改這個項目的代碼,大可將函數的調用放在try-catch語句中。
3.拋出錯誤
與try-catch語句相配的還有一個throw操作符,用於隨時拋出自定義錯誤。在遇到throw操作符時,代碼會立即停止執行。僅當有try-catch語句捕獲到被拋出的值時,代碼纔會繼續執行。
拋出錯誤,我們認爲只應該捕獲那些你確切地知道該如何處理的錯誤。捕獲錯誤的目的在於避免瀏覽器以默認方式處理它們;而拋出錯誤的目的在於提供錯誤發生具體原因的消息。
如 throw new Error("some text");
可以利用原型鏈來繼承Error來創建自定義錯誤
function CustomError(message){
this.name = "CustomError";
this.message = message;
}
CustomError.prototype = new Error();
function process(values){
if (!(values instanceof Array)){
throw new CustomError("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;
}
process("string");
4.錯誤事件
①任何沒有通過try-catch處理的錯誤都會觸發window對象的error事件。
如果要執行onerror事件處理程序,必須使用DOM0級技術,它沒有遵循“DOM2級事件”的標準格式。
它接受三個參數:錯誤消息、錯誤所在的URL和行號。只有錯誤消息最有用
只要發生錯誤,無論是不是瀏覽器生成的,都會觸發error事件
window.onerror = function(message, url, line){
alert(message);
return false;
};
throw new Error("Something bad happened.");
return false 這行代碼可以阻止瀏覽器報告錯誤的默認行爲
通過返回false,這個函數實際上就充當了整個文檔中的try-catch語句,可以捕獲所有無代碼處理的運行時錯誤。這個事件處理程序是避免瀏覽器報告錯誤的最後一道防線,理想情況下,只要可能就不應該使用它。只要能夠適當地使用try-catch語句,就不會又錯誤交給瀏覽器,也就不會觸發error事件。
②圖像也支持error事件
只要圖像的src特性中的URL不能返回可以被識別的圖像格式,就會觸發error事件。反之,觸發onload事件
5.常見的錯誤類型
①類型轉換錯誤,在if、for、while等流控制語句中使用非布爾值時,最常發生類型轉換錯誤
建議使用全等(===)和不全等(!==)操作符來比較數值,以避免類型轉換
②數據類型錯誤
識別類型對於非對象用typeof,對象用 instanceof
③通信錯誤
第一種錯誤通信錯誤與格式不正確的URL或發送的數據有關。最常見的問題是在數據發送給服務器之前,沒有使用encodeURLComponent()對數據進行編碼。
對於查詢字符串,應該記住必須要使用encodeURLComponent()方法