編寫可維護程式碼3:適當的丟擲錯誤提示
阿新 • • 發佈:2019-01-11
編寫可維護的程式碼規則第3篇。
在js開發中,除錯錯誤是一個比較頭疼的事,又不像java的debug那麼方便,定位錯誤往往不是那麼容易,除非對程式碼熟悉無比,但即使是自己寫的程式碼,功能一複雜,時間一長,再想快速定位問題,至少我現在是比較頭疼的。此時,如果有一個比較友好的錯誤提示,那解決問題的效率將大大提高。
所以是時候學會在合適的地方丟擲錯誤提示了。
js中丟擲錯誤的方法有兩種:throw new Error()
丟擲錯誤和try...catch..
捕獲錯誤。
先來看throw new Error()
:
function getDiv(el){
if(el && el.getElementsByTagName){
return el.getElementsByTagName('div');
}else {
throw new Error('getDiv(): Argument must be a Dom Element.')
}
}
var div = document.getElementById('div1');
getDiv(null); // Uncaught Error: getDiv(): Argument must be a Dom Element.
上例列印結果可知,明確給出了方法呼叫的錯誤提示。當getDiv()
Error
型別在所有的javascrit實現中都是有效的,它的構造器只接收一個引數,即錯誤訊息。當以這種方式丟擲錯誤時,如果沒有經try-catch
語句來捕獲的話,瀏覽器通常直接在控制檯顯示錯誤訊息字串。
通常在丟擲的錯誤提示字串中,應儘量寫清錯誤目標和原因。這樣做,當實際除錯時,能明確告訴開發者問題的定位。
那什麼時候需要丟擲錯誤呢?
- 修復一個自認為較複雜的錯誤後,及時增加相應的自定義錯誤提示。
- 寫程式碼時,思考不想要發生的程式時,針對這個不想要發生的事,丟擲錯誤提示。
再來看下try-catch
語句:
try {
throw new Error("wrong msg.");
} catch(err) {
console.log('catch msg: ' + err);
} finally {
console.log('finally msg.');
}
當try
塊中發生錯誤時,程式立即停止執行,並跳轉到catch
塊中,並傳入一個錯誤物件。至於後面的finally
塊,不管前面是否有錯誤發生,最終都會執行。
最後再來看看常見的錯誤型別。
- Error:所有錯誤的基本型別,實際上引擎從不會丟擲該型別的錯誤
- EvalError:通過
eval()
函式執行程式碼發生錯誤時丟擲 - RangerError:一個數字超出它的邊界時丟擲,比較罕見
- ReferenceError:期望的物件不存在時丟擲,如試圖在一個
null
物件引用上呼叫一個函式。 - SyntaxError:給
eval()
函式傳遞的程式碼中有語法錯誤時丟擲 - TypeError:變數不是期望型別時丟擲。如
new 10
或"prop" in true
- URIError:給
encodeURI()
、encodeURIComponent()
、decodeURI
或decodeURIComponent()
等函式傳遞格式非法的URI字串時丟擲
喜歡本文請掃下方二維碼,關注微信公眾號: 前端小二,檢視更多我寫的文章哦,多謝支援。