Baseline Widely available
ÐонÑÑÑÑкÑÐ¸Ñ try...catch
пÑÑаеÑÑÑ Ð²ÑполниÑÑ Ð¸Ð½ÑÑÑÑкÑии в блоке try
, и, в ÑлÑÑае оÑибки, вÑполнÑÐµÑ Ð±Ð»Ð¾Ðº catch
.
try { try_statements } [catch (exception_var_1 if condition_1) { // не ÑÑандаÑÑно catch_statements_1 }] ... [catch (exception_var_2) { catch_statements_2 }] [finally { finally_statements }]
try_statements
ÐнÑÑÑÑкÑии Ð´Ð»Ñ Ð²ÑполнениÑ.
catch_statements_1
, catch_statements_2
ÐнÑÑÑÑкÑии, коÑоÑÑе бÑдÑÑ Ð²ÑполненÑ, еÑли пÑоизойдÑÑ Ð¾Ñибка в блоке try
.
exception_var_1
, exception_var_2
ÐденÑиÑикаÑÐ¾Ñ Ð´Ð»Ñ Ñ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑа оÑибки, коÑоÑÑй впоÑледÑÑвии иÑполÑзÑеÑÑÑ Ð² блоке catch
condition_1
УÑловное вÑÑажение.
finally_statements
ÐнÑÑÑÑкÑии, коÑоÑÑе вÑполнÑÑÑÑÑ Ð¿Ð¾Ñле завеÑÑÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ° try
. ÐÑполнение пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð² незавиÑимоÑÑи Ð¾Ñ Ñого, пÑоизоÑла оÑибка или неÑ.
ÐонÑÑÑÑкÑÐ¸Ñ try
ÑодеÑÐ¶Ð¸Ñ Ð±Ð»Ð¾Ðº try
, в коÑоÑом наÑ
одиÑÑÑ Ð¾Ð´Ð½Ð° или неÑколÑко инÑÑÑÑкÑий (Ðлок ({}
) обÑзаÑелÑно должен пÑиÑÑÑÑÑвоваÑÑ, даже еÑли вÑполнÑеÑÑÑ Ð²Ñего одна инÑÑÑÑкÑиÑ), и Ñ
оÑÑ Ð±Ñ Ð¾Ð´Ð¸Ð½ блок catch
или finally
. Таким обÑазом, еÑÑÑ ÑÑи оÑновнÑе ÑоÑÐ¼Ñ ÐºÐ¾Ð½ÑÑÑÑкÑии try
:
try {...} catch {...}
try {...} finally {...}
try {...} catch {...} finally {...}
Ðлок catch
ÑодеÑÐ¶Ð¸Ñ Ð¸Ð½ÑÑÑÑкÑии, коÑоÑÑе бÑдÑÑ Ð²ÑполненÑ, еÑли в блоке try
пÑоизоÑла оÑибка. ÐÑли лÑÐ±Ð°Ñ Ð¸Ð½ÑÑÑÑкÑÐ¸Ñ Ð² блоке try
вÑбÑаÑÑÐ²Ð°ÐµÑ Ð¸ÑклÑÑение, Ñо ÑпÑавление ÑÑÐ°Ð·Ñ Ð¶Ðµ пеÑеÑ
Ð¾Ð´Ð¸Ñ Ð² блок catch
. ÐÑли в блок try
не бÑло вÑбÑоÑено иÑклÑÑение, Ñо блок catch
не вÑполнÑеÑÑÑ.
Ðлок finally
вÑполниÑÑÑ Ð¿Ð¾Ñле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð±Ð»Ð¾ÐºÐ¾Ð² try
и catch
, но пеÑед инÑÑÑÑкÑиÑми, ÑледÑÑÑими за конÑÑÑÑкÑией try...catch
. Ðн вÑполнÑеÑÑÑ Ð²Ñегда, в незавиÑимоÑÑи Ð¾Ñ Ñого, бÑло иÑклÑÑение или неÑ.
ÐÑ Ð¼Ð¾Ð¶ÐµÑе иÑполÑзоваÑÑ Ð²Ð»Ð¾Ð¶ÐµÐ½Ð½Ñе конÑÑÑÑкÑии try
. ÐÑли внÑÑÑеннÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¸Ñ try
не Ð¸Ð¼ÐµÐµÑ Ð±Ð»Ð¾ÐºÐ° catch
(Ñакое Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ñи ÐµÑ Ð¸ÑполÑзовании в виде try {...} finaly {...}
, поÑÐ¾Ð¼Ñ ÑÑо try {...}
не Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð±ÐµÐ· блоков catch или finally
), бÑÐ´ÐµÑ Ð²Ñзван Ñatch
внеÑней конÑÑÑÑкÑии try
.
ÐонÑÑÑÑкÑÐ¸Ñ try
Ñакже иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑабоÑки иÑклÑÑений JavaScript (Ñо еÑÑÑ, вÑбÑоÑеннÑÑ
внÑÑÑенними ÑÑнкÑиÑми ÑзÑка или паÑÑеÑом). ÐаглÑниÑе в JavaScript ÑÑководÑÑво Ð´Ð»Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑии о JavaScript иÑклÑÑениÑÑ
.
ÐÑи иÑполÑзовании блока catch
, он вÑзÑваеÑÑÑ Ð´Ð»Ñ Ð»Ñбого иÑклÑÑÐµÐ½Ð¸Ñ Ð² блоке try
. ÐапÑимеÑ, когда в ÑледÑÑÑем коде пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¾Ñибка, ÑпÑавление пеÑеÑ
Ð¾Ð´Ð¸Ñ Ðº Ð±Ð»Ð¾ÐºÑ catch
.
try {
throw "myException"; // Ñоздание иÑклÑÑениÑ
} catch (e) {
// инÑÑÑÑкÑии Ð´Ð»Ñ Ð¾Ð±ÑабоÑки оÑибок
logMyErrors(e); // пеÑедаÑÑ Ð¾Ð±ÑÐµÐºÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑабоÑÑÐ¸ÐºÑ Ð¾Ñибок
}
Ðлок catch
задаÑÑ Ð¸Ð´ÐµÐ½ÑиÑикаÑÐ¾Ñ (e
в пÑимеÑе вÑÑе) коÑоÑÑй ÑодеÑÐ¶Ð¸Ñ Ð¾Ð±ÑÐµÐºÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ (в пÑимеÑе вÑÑе â знаÑение, пеÑеданное опеÑаÑоÑÑ throw
). ÐблаÑÑÑ Ð²Ð¸Ð´Ð¸Ð¼Ð¾ÑÑи ÑÑого обÑекÑа огÑаниÑиваеÑÑÑ Ð±Ð»Ð¾ÐºÐ¾Ð¼ catch
.
catch
"УÑловнÑе блоки catch
" можно ÑоздаваÑÑ, иÑполÑзÑÑ try...catch
Ñ if...else if...else
, как здеÑÑ:
try {
myroutine(); // Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑаÑÑваÑÑ ÑÑи вида иÑклÑÑений
} catch (e) {
if (e instanceof TypeError) {
// обÑабоÑка иÑклÑÑÐµÐ½Ð¸Ñ TypeError
} else if (e instanceof RangeError) {
// обÑабоÑка иÑклÑÑÐµÐ½Ð¸Ñ RangeError
} else if (e instanceof EvalError) {
// обÑабоÑка иÑклÑÑÐµÐ½Ð¸Ñ EvalError
} else {
// обÑабоÑка оÑÑалÑнÑÑ
иÑклÑÑений
logMyErrors(e); // пеÑедаÑÑ Ð¾Ð±ÑабоÑÑÐ¸ÐºÑ Ð¾Ñибок
}
}
ЧаÑÑÑй ÑÑенаÑий иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ â обÑабоÑаÑÑ Ð¸Ð·Ð²ÐµÑÑнÑе иÑклÑÑениÑ, а пÑи неизвеÑÑнÑÑ Ð¾ÑÐ¸Ð±ÐºÐ°Ñ , пÑобÑоÑиÑÑ Ð¸Ñ Ð´Ð°Ð»ÑÑе:
try {
myRoutine();
} catch (e) {
if (e instanceof RangeError) {
// обÑабоÑка извеÑÑного иÑклÑÑениÑ, Ñ ÐºÐ¾ÑоÑÑм
// понÑÑно, ÑÑо делаÑÑ
} else {
throw e; // пÑобÑоÑиÑÑ Ð½ÐµÐ¸Ð·Ð²ÐµÑÑнÑе оÑибки
}
}
ÐденÑиÑикаÑÐ¾Ñ Ð¸ÑклÑÑениÑ
Ðогда в блоке try
вÑбÑаÑÑваеÑÑÑ Ð¸ÑклÑÑение, exception_var
(Ñ. е. e
в конÑÑÑÑкÑии catch (e)
) ÑодеÑÐ¶Ð¸Ñ Ð·Ð½Ð°Ñение иÑклÑÑениÑ. Ðго можно иÑполÑзоваÑÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð±Ð¾Ð»ÑÑе инÑоÑмаÑии об вÑбÑоÑенном иÑклÑÑении. ÐденÑиÑикаÑÐ¾Ñ Ð´Ð¾ÑÑÑпен ÑолÑко в облаÑÑи видимоÑÑи блока catch
.
try {
if (!firstValidation()) {
throw 1;
}
if (!secondValidation()) {
throw 2;
}
} catch (e) {
// ÐÑÐ²Ð¾Ð´Ð¸Ñ 1 или 2 (еÑли не пÑоизоÑло никакиÑ
дÑÑгиÑ
оÑибок)
console.log(e);
}
Ðлок finally
Ðлок finally
ÑодеÑÐ¶Ð¸Ñ ÐºÐ¾Ð´ коÑоÑÑй бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑен поÑле кода в блокаÑ
try
и catch
. ÐбÑаÑиÑе внимание, ÑÑо код в блоке finally
запÑÑкаеÑÑÑ Ð² незавиÑимоÑÑи Ð¾Ñ Ñого, бÑло ли вÑбÑоÑено иÑклÑÑение или неÑ. Также код в блоке finally
бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑен вне завиÑимоÑÑи Ð¾Ñ Ñого, пÑиÑÑÑÑÑвÑÐµÑ Ð±Ð»Ð¾Ðº catch
или неÑ. Ðлок finally
можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑкÑÐ¸Ð¿Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñно завеÑÑил ÑабоÑÑ Ð² ÑлÑÑае оÑибки. ÐапÑимеÑ, еÑли необÑ
одимо оÑвободиÑÑ Ð¿Ð°Ð¼ÑÑÑ Ð¸ ÑеÑÑÑÑÑ ÐºÐ¾ÑоÑÑе иÑполÑзовал ÑкÑипÑ.
ÐалиÑие ÑпеÑиалÑного блока, ÑвÑзанного Ñ Ð¾Ñибкой, коÑоÑÑй вÑполнÑеÑÑÑ Ð²Ð½Ðµ завиÑимоÑÑи Ð¾Ñ Ð½Ð°Ð»Ð¸ÑÐ¸Ñ Ð¸ÑклÑÑиÑелÑной ÑиÑÑаÑии, Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ ÑÑÑаннÑм, но ÑÑа конÑÑÑÑкÑÐ¸Ñ Ð½Ð° Ñамом деле веÑÑма полезна. РаÑÑмоÑÑим пÑÐ¸Ð¼ÐµÑ ÐºÐ¾Ð´Ð°:
function expensiveCalculations() {
// СложнÑе вÑÑиÑлениÑ
}
function maybeThrowError() {
// ФÑнкÑиÑ, коÑоÑÐ°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑоÑиÑÑ Ð¸ÑклÑÑение
if (Math.random() > 0.5) throw new Error();
}
try {
// ТепеÑÑ Ð¿Ñи пÑокÑÑÑке ÑÑÑаниÑÑ Ð±ÑдÑÑ Ð¿ÑоиÑÑ
одиÑÑ
// ÑложнÑе вÑÑиÑлениÑ, ÑÑо ÑилÑно ÑкажеÑÑÑ Ð½Ð°
// пÑоизводиÑелÑноÑÑи
window.addEventListener("scroll", expensiveCalculations);
maybeThrowError();
} catch {
// ÐÑли ÑÑнкÑÐ¸Ñ maybeThrowError вÑбÑоÑÐ¸Ñ Ð¸ÑклÑÑениÑ,
// ÑпÑавление ÑÑÐ°Ð·Ñ Ð¿ÐµÑейдÑÑ Ð² блок catch и
// ÑложнÑе вÑÑиÑÐ»ÐµÐ½Ð¸Ñ Ð¿ÑÐ¾Ð´Ð¾Ð»Ð¶Ð°Ñ Ð²ÑполнÑÑÑÑÑ Ð´Ð¾
// пеÑезагÑÑзки ÑÑÑаниÑÑ
maybeThrowError();
}
window.removeEventListener("scroll", expensiveCalculations);
Ð ÑÑом пÑимеÑе, еÑли ÑÑнкÑÐ¸Ñ maybeThrowError
вÑбÑоÑÐ¸Ñ Ð¸ÑклÑÑение внÑÑÑи блока try
, ÑпÑавление пеÑейдÑÑ Ð² блок catch
. ÐÑли и в блоке catch
ÑÑа ÑÑнкÑÐ¸Ñ Ñоже вÑбÑоÑÐ¸Ñ Ð¸ÑклÑÑение, Ñо вÑполнение кода пÑеÑвÑÑÑÑ, и обÑабоÑÑик ÑобÑÑÐ¸Ñ Ð½Ðµ бÑÐ´ÐµÑ ÑнÑÑ, пока полÑзоваÑÐµÐ»Ñ Ð½Ðµ пеÑезагÑÑÐ·Ð¸Ñ ÑÑÑаниÑÑ, ÑÑо плоÑ
о ÑкажеÑÑÑ Ð½Ð° ÑкоÑоÑÑи ÑабоÑÑ. ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¸Ð·Ð±ÐµÐ¶Ð°ÑÑ ÑакиÑ
ÑиÑÑаÑий, ÑледÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð±Ð»Ð¾Ðº finally
:
try {
window.addEventListener("scroll", expensiveCalculations);
maybeThrowError();
} catch {
maybeThrowError();
} finally {
window.removeEventListener("scroll", expensiveCalculations);
}
ÐÑÑгой пÑимеÑ: ÑабоÑа Ñ Ñайлами. Ð ÑледÑÑÑем ÑÑагменÑе кода показÑваеÑÑÑ, как ÑкÑÐ¸Ð¿Ñ Ð¾ÑкÑÑÐ²Ð°ÐµÑ Ñайл и запиÑÑÐ²Ð°ÐµÑ Ð² него какие-Ñо даннÑе (в ÑеÑвеÑном окÑÑжении JavaScript Ð¸Ð¼ÐµÐµÑ Ð´Ð¾ÑÑÑп к Ñайловой ÑиÑÑеме). Ðо вÑÐµÐ¼Ñ Ð·Ð°Ð¿Ð¸Ñи Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоизойÑи оÑибка. Ðо поÑле оÑкÑÑÑÐ¸Ñ Ñайл оÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ð¾ закÑÑÑÑ, поÑÐ¾Ð¼Ñ ÑÑо незакÑÑÑÑй Ñайл Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к ÑÑеÑкам памÑÑи. Ð ÑакиÑ
ÑлÑÑаÑÑ
иÑполÑзÑеÑÑÑ Ð±Ð»Ð¾Ðº finally
:
openMyFile();
try {
// СделаÑÑ ÑÑо-Ñо Ñ Ñайлом
writeMyFile(theData);
} finally {
closeMyFile(); // ÐакÑÑÑÑ Ñайл, ÑÑо Ð±Ñ Ð½Ð¸ пÑоизоÑло
}
ÐÑимеÑÑ ÐложеннÑе блоки try
ÐÐ»Ñ Ð½Ð°Ñала давайÑе поÑмоÑÑим ÑÑо Ð´ÐµÐ»Ð°ÐµÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´:
try {
try {
throw new Error("ÑпÑ");
} finally {
console.log("finally");
}
} catch (e) {
console.error("внеÑний блок catch", e.message);
}
// ÐÑвод:
// "finally"
// "внеÑний блок catch" "ÑпÑ"
ТепеÑÑ Ð¾Ñловим иÑклÑÑение во внÑÑÑеннем блоке try
, добавив к Ð½ÐµÐ¼Ñ Ð±Ð»Ð¾Ðº catch
:
try {
try {
throw new Error("ÑпÑ");
} catch (e) {
console.error("внÑÑÑенний блок catch", e.message);
} finally {
console.log("finally");
}
} catch (e) {
console.error("внеÑний блок catch", e.message);
}
// Output:
// "внÑÑÑенний блок catch" "ÑпÑ"
// "finally"
ÐаконеÑ, пÑобÑоÑим оÑибкÑ
try {
try {
throw new Error("ÑпÑ");
} catch (e) {
console.error("внÑÑÑенний блок catch", e.message);
throw e;
} finally {
console.log("finally");
}
} catch (e) {
console.error("внеÑний блок catch", e.message);
}
// ÐÑвод:
// "внÑÑÑенний блок catch" "oops"
// "finally"
// "внеÑний блок catch" "oops"
ÐÑбое иÑклÑÑение бÑÐ´ÐµÑ Ð¿ÐµÑедано ÑолÑко в ближайÑий блок catch
, еÑли он не пÑобÑоÑÐ¸Ñ ÐµÐ³Ð¾ далÑÑе. ÐÑе иÑклÑÑениÑ, вÑбÑоÑеннÑми внÑÑÑенними блоками (поÑÐ¾Ð¼Ñ ÑÑо код в блоке catch
Ñакже Ð¼Ð¾Ð¶ÐµÑ Ð²ÑбÑоÑиÑÑ Ð¸ÑклÑÑение), бÑдÑÑ Ð¿Ð¾Ð¹Ð¼Ð°Ð½Ñ Ð²Ð½ÐµÑними.
ÐÑли блок finally
возвÑаÑÐ°ÐµÑ ÐºÐ°ÐºÐ¾Ðµ-либо знаÑение, оно ÑÑановиÑÑÑ Ð·Ð½Ð°Ñением, коÑоÑое возвÑаÑÐ°ÐµÑ Ð²ÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¸Ñ try...catch...finally
, вне завиÑимоÑÑи Ð¾Ñ Ð»ÑбÑÑ
инÑÑÑÑкÑий return
в блокаÑ
try
и catch
. Также игноÑиÑÑÑÑÑÑ Ð¸ÑклÑÑениÑ, вÑбÑоÑеннÑе блоком catch
.
(() => {
try {
try {
throw new Error("oops");
} catch (ex) {
console.error("inner", ex.message);
throw ex;
} finally {
console.log("finally");
return;
}
} catch (ex) {
console.error("outer", ex.message);
}
})();
// Logs:
// "inner" "oops"
// "finally"
"ÑпÑ" не доÑ
Ð¾Ð´Ð¸Ñ Ð´Ð¾ внеÑнего блока из-за инÑÑÑÑкÑии return
в блоке finally
. То же Ñамое пÑоизойдÑÑ Ñ Ð»ÑбÑм знаÑением, возвÑаÑаемÑм из блока catch
.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4