歡迎訪問主頁,有更多文章內(nèi)容
轉載請注明原出處
原文鏈接地址:使用try catch 要注意地方
try
在平時的開發(fā)過程中try catch
并不少用, 因此在開發(fā)中需要了解和運用它們的使用場景。
基本語法
try {
//可能會導致錯誤的代碼
} catch (error) {
//在錯誤發(fā)生時怎么處理
}finally {
//即使報錯始終執(zhí)行
}
如果try塊中的任何代碼發(fā)生了錯誤,就會立即退出代碼執(zhí)行過程星持,然后接著執(zhí)行catch塊,此時枚冗,catch塊會接受到一個包含錯誤信息的對象座泳。都有一個保存著錯誤消息的message屬性。
當Javascript引擎執(zhí)行代碼是洒沦,發(fā)生的錯誤豹绪。可能是語法錯誤申眼,通常是程序員造成的編碼錯誤或者錯別字瞒津,也可能是來自服務器或者用戶的錯誤輸出而導致的錯誤等。
能被 try catch 捕捉到的異常括尸,必須是在報錯的時候巷蚪,線程執(zhí)行已經(jīng)進入 try catch 代碼塊,且處在 try catch 里面濒翻,這個時候才能被捕捉到屁柏。
try{
setTimeout(()=>{
console.log(a.b);
}, 100)
}catch(e){
console.log('error',e);
}
console.log(111);
// 111
// Uncaught ReferenceError: a is not defined
setTimeout里面報錯,實際是100ms之后執(zhí)行的代碼報錯有送,此時try-catch已經(jīng)執(zhí)行完成前联,console.log都已經(jīng)被執(zhí)行完了,所以沒有辦法捕獲到異常娶眷。
finally
finally在try-catch語句中是可選的似嗤,但是finally子句一經(jīng)使用,其代碼無論如何都會執(zhí)行届宠。無論try或者catch語句塊中包含什么代碼烁落,包括return語句,都不會阻止finally子句的執(zhí)行豌注。
function testFinally(){
try{
return 2;
}catch(error){
return 1; //
}finally{
return 0
}
}
從表面上看伤塌,這個函數(shù)會返回2,執(zhí)行這個函數(shù)且不會報錯轧铁,但是由于最后還有一個finally子句每聪,結果會導致該return語句忽略,所以這個函數(shù)只能返回0齿风。
切記药薯,只要代碼中包含finally子句,那么無論try還是catch語句塊中的return都將被忽略救斑。所以在使用finally之前童本,需要想清楚你的代碼應該符合你的業(yè)務邏輯。
拋出錯誤
throw
操作符脸候,用于隨時拋出自定義錯誤穷娱。拋出錯誤時绑蔫,必須給throw
操作符指定一個值。這個值的類型沒有限制泵额。
在遇到throw
操作符是配深,代碼會立即停止執(zhí)行。僅當有try-catch語句捕獲到被拋出的值時嫁盲,代碼才能繼續(xù)執(zhí)行篓叶。
對于瀏覽器的兼容問,可以高效的定位錯誤的原因亡资。
function process(values){
values.sort();
for(var i = 0; i < values.length; i++){
if(values[i]>100){
return values[i];
}
}
return -1;
}
如果執(zhí)行process這個函數(shù)是,傳入的values是一個string向叉,那么調(diào)用sort()就會報錯锥腻,對此,不同的瀏覽器會給出不同的錯誤消息母谎,但都不是特別明確瘦黑;
- 在IE下:屬性或方法不存在
- 在Firefox下:values.sort()不是一個函數(shù)
- 在Safari下:值undefined不是對象
- 在Chrome下:對象名沒有方法'sort'
- 在Opera下:類型不匹配
等等
為了兼容方便調(diào)試和開發(fā),可以在這個方法中加入一個類型檢測
function process1(values){
if(!(values instanceof Array)){
throw new Error ("process1(): Argument must be an Array");
}
...
}
這樣重寫函數(shù)后奇唤,如果values的參數(shù)類型不是Array幸斥,就會拋出一個錯誤。
拋出錯誤與使用try-catch咬扇。只應該捕獲哪些我們確切地知道該如何處理的錯誤甲葬。捕獲錯誤的目的在于避免瀏覽器已默認方式處理它們,而拋出錯誤的目的在于提錯誤發(fā)生的具體原因懈贺。
常見的錯誤類型
錯誤處理的核心经窖,是首先要知道代碼里發(fā)生什么錯誤。錯誤只會在代碼運行期間出現(xiàn)梭灿,一般來說画侣,我們需要關注三種錯誤:
- 類型轉換錯誤
- 數(shù)據(jù)類型錯誤
- 通信錯誤
這些錯誤分別會在特定的模式下或者沒有對值進行足夠的檢查的情況下發(fā)生。
歡迎訪問主頁堡妒,有更多文章內(nèi)容
轉載請注明原出處
原文鏈接地址:使用try catch 要注意地方