##1.錯誤處理語法:(js 沒有異常 exception 一說,都是錯誤 error)
try{
//throw new Error(msg);
//throw '錯誤';
//throw false;
//throw ...
//throw 操作符的操作數沒有任何限制,可以隨便扔
}
catch(err){
//alert(err.message);//message 是唯一一個全瀏覽器支持的屬性
}
finally{
//
}
注意:[IE7-] 有個 bug:沒有 catch 塊,finally 塊就不執行,所以盡量使用完整的 try-catch-finally
高程中有一個描述上的錯誤(中文版 501 頁):
請讀者務必記住,只要代碼中包含 finally 子句,那麼無論 try 還是 catch 語句塊中的 return 語句都將被忽略。
本機測試��果:對於進入 finally 之前遇到的 return,在 finally 完成之後還會 return。而不是書上說的「忽略」,應該只是歧義。
此外,js 存在和 java 異常處理一樣的祕密,例如:
//代碼來自 http://www.cnblogs.com/averey/p/4379646.html
function aaa(){
var x = 1;
try {
return ++x;
} catch (err) {
} finally {
++x;
}
return x;
}
(function(){
var y = aaa();
alert(y);//2
})();
詳情請查看:
當然,這種小祕密知道就好,不必深究
##2.七種錯誤類型
-
Error
-
EvalError
-
RangeError
-
ReferenceError
-
SyntaxError
-
TypeError
-
URIError
##3.error 事件
作為避免瀏覽器報錯的最後一道防線,語法如下:
window.onerror = function(msg, url, line){
return true;//不報錯
}
注意:只能用上面的 DOM0 級方式添加事件處理器,因為它沒有遵循 DOM2 級標準
注意:高程中文第三版 506 頁有點問題,實際上是返回 true 表示不報錯,而不是書上的返回 false,測試代碼如下:
window.onerror = function(e) {
return true;//Chrome, FF, IE8 都不報錯
//return false;//Chrome, FF 報錯,IE8 不報錯
}
'str'.startWith('x');///觸發錯誤
##4.一些常識
-
盡量使用===和!==來比較,以避免類型轉換和類型轉換錯誤
-
在控制語句中盡量使用布林值,而不要用 if(value) 這樣的結構,因為自動進行的類型轉換會導致存在多個假值:
-
false
-
+0/-0
-
undefined
-
null
-
''/""(空字符串)
-
NaN
-
這些假值可能會導致出乎意料的結果,如果只用===和!==的話就只有 false 一個假值,可以精確地表意
-
不要用 if(value != null) 和 if(value != undefined) 這樣的檢測,而應該:
-
用 if(value instanceof Type) 來檢測對象值
-
用 if(typeof value === strType) 來檢測基礎類型值
-
-
不要用 body 中的腳本進行 document.body 相關 DOM 操作(增刪節點),因為可能會引發 IE 錯誤
-
外部 js 文件也可能導致 js 語法錯誤,而報錯信息望望不準確,難以發現,所以在引用外部腳本之前應該做充分的測試
-
IE 對 URI 長度限制不超過 2048 個字符,因此在使用 get 替代 post 請求優化性能的時候,應該盡量減少查詢字符串的長度(比如用短點的字段名)
暫無評論,快來發表你的看法吧