Finally или пÑоÑÑо код?
СÑавниÑе два ÑÑагменÑа кода.
-
ÐеÑвÑй иÑполÑзÑеÑ
finallyÐ´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð° поÑлеtry..catch:try { наÑаÑÑ ÑабоÑÑ ÑабоÑаÑÑ } catch (e) { обÑабоÑаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ } finally { оÑиÑÑиÑÑ ÑабоÑее пÑоÑÑÑанÑÑво } -
ÐÑоÑой ÑÑÐ°Ð³Ð¼ÐµÐ½Ñ Ð¿ÑоÑÑо ÑÑÐ°Ð²Ð¸Ñ Ð¾ÑиÑÑÐºÑ Ð¿Ð¾Ñле
try..catch:try { наÑаÑÑ ÑабоÑÑ ÑабоÑаÑÑ } catch (e) { обÑабоÑаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ } оÑиÑÑиÑÑ ÑабоÑее пÑоÑÑÑанÑÑво
Ðам опÑеделÑнно нÑжна оÑиÑÑка поÑле ÑабоÑÑ, неважно возникли оÑибки или неÑ.
ÐÑÑÑ Ð»Ð¸ здеÑÑ Ð¿ÑеимÑÑеÑÑво в иÑполÑзовании finally или оба ÑÑагменÑа кода одинаковÑ? ÐÑли Ñакое пÑеимÑÑеÑÑво еÑÑÑ, Ñо дайÑе пÑимеÑ, когда оно пÑоÑвлÑеÑÑÑ.
РазниÑа в поведении ÑÑÐ°Ð½ÐµÑ Ð¾Ñевидной, еÑли ÑаÑÑмоÑÑеÑÑ ÐºÐ¾Ð´ внÑÑÑи ÑÑнкÑии.
Ðоведение бÑÐ´ÐµÑ ÑазлиÑнÑм, еÑли ÑпÑавление каким-Ñо обÑазом вÑпÑÑÐ³Ð½ÐµÑ Ð¸Ð· try..catch.
ÐапÑимеÑ, когда еÑÑÑ return внÑÑÑи try..catch. СекÑÐ¸Ñ finally ÑабоÑÐ°ÐµÑ Ð² лÑбом ÑлÑÑае пÑи лÑбом вÑÑ
оде из try..catch, даже ÑеÑез return: ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле Ñого как try..catch вÑполниÑÑÑ, но до Ñого, как вÑзÑваÑÑий код полÑÑÐ¸Ñ ÐºÐ¾Ð½ÑÑолÑ.
function f() {
try {
alert('наÑало');
return "result";
} catch (e) {
/// ...
} finally {
alert('оÑиÑÑка!');
}
}
f(); // оÑиÑÑка!
â¦Ðли когда еÑÑÑ throw, напÑимеÑ, как здеÑÑ:
function f() {
try {
alert('наÑало');
throw new Error("оÑибка");
} catch (e) {
// ...
if("не Ð¼Ð¾Ð³Ñ Ð¾Ð±ÑабоÑаÑÑ Ð¾ÑибкÑ") {
throw e;
}
} finally {
alert('оÑиÑÑка!')
}
}
f(); // оÑиÑÑка!
Ðменно finally гаÑанÑиÑÑÐµÑ Ð¾ÑиÑÑкÑ. ÐÑли Ð¼Ñ Ð¿ÑоÑÑо помеÑÑим код в конÑе f, Ñо он не вÑполниÑÑÑ Ð² опиÑаннÑÑ
ÑиÑÑаÑиÑÑ
.