跳到主要內容
黯羽輕揚每天積累一點點

JS 學習筆記 8_錯誤處理

免費2015-04-12#JS#js错误处理

本文介紹 js 的錯誤處理語法,錯誤類型,error 事件,以及 6 個避免錯誤的常識

##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.一些常識

  1. 盡量使用===和!==來比較,以避免類型轉換和類型轉換錯誤

  2. 在控制語句中盡量使用布林值,而不要用 if(value) 這樣的結構,因為自動進行的類型轉換會導致存在多個假值:

    • false

    • +0/-0

    • undefined

    • null

    • ''/""(空字符串)

    • NaN

這些假值可能會導致出乎意料的結果,如果只用===和!==的話就只有 false 一個假值,可以精確地表意

  1. 不要用 if(value != null) 和 if(value != undefined) 這樣的檢測,而應該:

    • 用 if(value instanceof Type) 來檢測對象值

    • 用 if(typeof value === strType) 來檢測基礎類型值

  2. 不要用 body 中的腳本進行 document.body 相關 DOM 操作(增刪節點),因為可能會引發 IE 錯誤

  3. 外部 js 文件也可能導致 js 語法錯誤,而報錯信息望望不準確,難以發現,所以在引用外部腳本之前應該做充分的測試

  4. IE 對 URI 長度限制不超過 2048 個字符,因此在使用 get 替代 post 請求優化性能的時候,應該盡量減少查詢字符串的長度(比如用短點的字段名)

評論

暫無評論,快來發表你的看法吧

提交評論