首先一個常識就是,在瀏覽器執行JS腳本過程中,當出現腳本錯誤,並且你沒有手動進行異常捕捉時,他會在瀏覽器下面出現黃色的嘆號,這是正常的,這也不是最重要的,最重要的是,出錯行以下的所有JS代碼將中停執行,這是我們不希望看到的,所以說,對於自己寫的,拿不准的腳本還是加上異常捕捉比較好。
try: 語句測試代碼塊的錯誤,一般把可能會出錯的代碼放到這里
catch: 只有try里面的代碼塊發生錯誤時,才會執行這里的代碼,參數err記錄着try里面代碼的錯誤信息
finally: 無論有無異常里面代碼都會執行
使用場景:為容易出錯的,容易產生兼容問題的代碼段加上try..catch。合處理那些我們無法控制的錯誤,如I/O操作,后端java讀取I/O操作比較多比如讀數據庫,所以用try catch比較多。前端可以用在上傳圖片或async await同步調接口。
注:ECMA-262第3版引入了try catch語句,作為JavaScript中處理異常的一種標准方式。但是在前端js代碼中很少看到try catch語句,並不是所以代碼都需要加try catch來作得不償失的“保險”。
try catch缺點:
1.try catch耗性能
2.try catch捕獲不到異步錯誤
3.try catch可能會導致報錯點更模糊
順序:
try里面的代碼報錯的時候,catch里面的代碼才會執行,finally里面的代碼永遠會執行
catch和finally里面,正常的代碼會從上到下順序執行
如果只是catch里面代碼出錯,則報catch里面的錯誤
如果catch和finally都出錯則會報finally里面的錯誤
例子1
<script> var a = "hello"; try{ alert(a); //如果是不存在的變量,則拋出異常,將直接跳到catch里面執行(throw定義異常也不會被拋出) throw "不存在"; //定義拋出異常 alert("I am try"); //只要上面的語句出現錯誤或者throw語句這句將不會被執行 }catch(err){
//如果try中發現錯誤,則執行catch中的語句,如果沒有錯誤,則跳過catch
alert(err) //接收設置的throw錯誤異常,如果沒有則拋出根據情況默認錯誤 alert("錯誤彈出"); //被執行 }finally{ alert("無論如何都會執行"); } // var b="world"; // if(b){ // document.write(b); // }else{ // alert("error"); // } </script>
err具有下面一些主要屬性:
- description: 錯誤描述 (僅IE可用).
- fileName: 出錯的文件名 (僅Mozilla可用).
- lineNumber: 出錯的行數 (僅Mozilla可用).
- message: 錯誤信息 (在IE下同description)
- name: 錯誤類型.
- number: 錯誤代碼 (僅IE可用).
- stack: 像Java中的Stack Trace一樣的錯誤堆棧信息 (僅Mozilla可用).