異常處理:try....catch
js代碼執(zhí)行特點(diǎn):從上向下執(zhí)行烦衣,在執(zhí)行的過程中如果出現(xiàn)了錯誤或者異常讥此,那么就直接報錯或拋出了異常兔甘。只要出錯,那么后面的代碼就不會再被執(zhí)行卤恳。
try{
//這里寫可能出現(xiàn)異常的代碼
}catch(e){
//這里的e就是捕獲的異常對象
//可以在這里寫累盗,出現(xiàn)異常后的處理代碼
}
異常捕獲語句執(zhí)行的過程為:
01 代碼正常運(yùn)行, 如果在try中出現(xiàn)了錯誤, try 里面出現(xiàn)錯誤的語句后面的代碼都不再執(zhí)行, 直接跳轉(zhuǎn)到 catch 中
02 在catch中處理錯誤信息
03 繼續(xù)執(zhí)行后面的代碼
04 如果 try 中沒有出現(xiàn)錯誤, 那么不走 catch 直接執(zhí)行后面的代碼
捕獲異常的優(yōu)點(diǎn):通過try-catch語句進(jìn)行異常捕獲之后,代碼將會繼續(xù)執(zhí)行纬黎,而不會中斷幅骄。
注意:語法錯誤異常用try-catch語句無法捕獲劫窒,因?yàn)樵陬A(yù)解析階段本今,語法錯誤會直接檢測出來,而不會等到運(yùn)行的時候才報錯主巍。
try..catch使用示例
//01 try ... catch結(jié)構(gòu)的使用
//a(); 若直接調(diào)用則爆出:Uncaught ReferenceError: a is not defined錯誤
//在開發(fā)中,我們對于可能會報錯或者是發(fā)生異常的代碼用try結(jié)構(gòu)進(jìn)行處理
try{
a(); //如果發(fā)生異常,那么至少不會到正程序中斷
}
catch(e)
{
//如果try語句中發(fā)生了異常,那么會執(zhí)行此處的代碼塊
//參數(shù)e.為具體的異常信息,可以打印進(jìn)行查看
console.log(e);
}
function functionTest() {
console.log("functionTest");
};
functionTest();
//結(jié)論:使用try...catch結(jié)構(gòu),如果發(fā)生了異常,那么不會影響后面代碼的執(zhí)行,且我們可以在發(fā)生異常信息之后做出具體的處理
手動拋出異常
案例:自己寫的一個函數(shù)冠息,需要一個參數(shù),如果用戶不傳參數(shù)孕索,此時想直接給用戶拋出異常逛艰,就需要了解如何拋出異常。
拋出異常使用throw關(guān)鍵字搞旭,語法如下:
手動拋出異常信息(字符串)
try{
//a(); //如果發(fā)生異常,那么至少不會到正程序中斷
//不使用系統(tǒng)默認(rèn)的異常信息,嘗試手動拋出
throw "對不起,您調(diào)用了尚未定義的方法";
}
catch(e)
{
//如果try語句中發(fā)生了異常,那么會執(zhí)行此處的代碼塊
//參數(shù)e.為具體的異常信息,可以打印進(jìn)行查看
console.log(e);
}
function functionTest() {
console.log("functionTest");
};
functionTest();
手動拋出異常信息(對象)
try{
//a(); //如果發(fā)生異常,那么至少不會到正程序中斷
//不使用系統(tǒng)默認(rèn)的異常信息,嘗試手動拋出
throw {
errMsg:"具體的錯誤信息提示",
errCode:"指定錯誤類型的代號,如1001等"
};
}
catch(e)
{
//如果try語句中發(fā)生了異常,那么會執(zhí)行此處的代碼塊
//參數(shù)e.為具體的異常信息,可以打印進(jìn)行查看
console.log(e);
//在try語句中拋出的錯誤信息是什么,那么得到的異常信息就是什么
//如果拋出的是字符串,那么得到的就是字符串
//如果拋出的是對象,那么此處得到的就是對象
console.log(e.errMsg);
console.log(e.errCode);
}
function functionTest() {
console.log("functionTest");
};
functionTest();
異常捕獲語句的完整模式
異常捕獲語句的完整模式為try-catch-finally
try{
//在執(zhí)行的時候可能發(fā)生異常的代碼
b();
}
catch (e)
{
//如果try代碼塊中的代碼在執(zhí)行中發(fā)生了異常,那么就會執(zhí)行該代碼塊的代碼
//通過打印e對象可以查看具體的異常信息
console.log(e); //打印異常信息
}
finally {
//不論try語句中的代碼是否會發(fā)生異常,都一定會執(zhí)行此處的代碼塊
//一般在前端開發(fā)中很少使用,常用語后臺開發(fā)的資源釋放工作
console.log("無論如何總要執(zhí)行的代碼");
}
finally中的代碼散怖,不管是否發(fā)生異常,都會執(zhí)行肄渗。一般用在后端語言中镇眷,用來釋放資源,JavaScript中很少會用到翎嫡。