try/catch主要用于捕獲異常,try/catch語(yǔ)句包含了yigebtry塊,和至少有一個(gè)catch塊或者餓一個(gè)finally塊,有如下三種tyr聲明:
- try...catch
- try...finally
- try...catch...finally
try中放入可能會(huì)產(chǎn)生異常的語(yǔ)句或函數(shù)
catch塊中包含要執(zhí)行的語(yǔ)句,當(dāng)try中拋出異常時(shí),catch塊會(huì)捕獲這個(gè)異常信息,并執(zhí)行catch塊中的代碼,如果在try中沒(méi)有異常拋出,catch塊將會(huì)跳過(guò)。
finally在 try塊和catch塊之后執(zhí)行,無(wú)論是否有異常拋出或者是否被捕獲它總是執(zhí)行。當(dāng)在finally中拋出異常信息時(shí)會(huì)覆蓋try中的異常信息。
try {
tryCode - 嘗試執(zhí)行代碼塊
}
catch(err) {
catchCode - 捕獲錯(cuò)誤的代碼塊
}
finally {
finallyCode - 無(wú)論 try / catch 結(jié)果如何都會(huì)執(zhí)行的代碼塊
}
try…catch是同步代碼,只能捕獲“同步代碼”中的"運(yùn)行時(shí)異常","同步代碼"是無(wú)法獲取如setTimeout、Promise等異步代碼的異常
try {
console.log(1);
setTimeout(function(){
console.log(2);
throw new Error("This is a test error 2");
}, 0);
console.log(3);
} catch(err) {
}
console.log(4);
// 執(zhí)行結(jié)果為:1、3、4、2
假如 try {} catch(err) {} 這部分代碼為函數(shù)f1,setTimeOut里面定義的異步函數(shù),要在f1執(zhí)行完之后才會(huì)執(zhí)行,所以f1里面的catch是抓不到錯(cuò)誤。
try ... catch 作為同步代碼的異常捕獲語(yǔ)句,是在階段 1 執(zhí)行的。異步的錯(cuò)誤,發(fā)生階段 2,由此可知:已經(jīng)執(zhí)行完畢的 try ... catch 不可能捕獲到在它執(zhí)行完畢后所發(fā)生的錯(cuò)誤。