Ðеважно, наÑколÑко Ð¼Ñ Ñ Ð¾ÑоÑи в пÑогÑаммиÑовании, иногда наÑи ÑкÑипÑÑ ÑодеÑÐ¶Ð°Ñ Ð¾Ñибки. Ðни могÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÑÑ Ð¸Ð·-за наÑÐ¸Ñ Ð¿ÑÐ¾Ð¼Ð°Ñ Ð¾Ð², неожиданного ввода полÑзоваÑелÑ, непÑавилÑного оÑвеÑа ÑеÑвеÑа и по ÑÑÑÑÑе дÑÑÐ³Ð¸Ñ Ð¿ÑиÑин.
ÐбÑÑно ÑкÑÐ¸Ð¿Ñ Ð² ÑлÑÑае оÑибки «падаеÑ» (ÑÑÐ°Ð·Ñ Ð¶Ðµ оÑÑанавливаеÑÑÑ), Ñ Ð²Ñводом оÑибки в конÑолÑ.
Ðо еÑÑÑ ÑинÑакÑиÑеÑÐºÐ°Ñ ÐºÐ¾Ð½ÑÑÑÑкÑÐ¸Ñ try..catch, коÑоÑÐ°Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Â«Ð»Ð¾Ð²Ð¸ÑÑ» оÑибки и вмеÑÑо Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð´ÐµÐ»Ð°ÑÑ ÑÑо-Ñо более оÑмÑÑленное.
СинÑакÑÐ¸Ñ Â«tryâ¦catch»
ÐонÑÑÑÑкÑÐ¸Ñ try..catch ÑоÑÑÐ¾Ð¸Ñ Ð¸Ð· двÑÑ
оÑновнÑÑ
блоков: try, и заÑем catch:
try {
// код...
} catch (err) {
// обÑабоÑка оÑибки
}
РабоÑÐ°ÐµÑ Ð¾Ð½Ð° Ñак:
- СнаÑала вÑполнÑеÑÑÑ ÐºÐ¾Ð´ внÑÑÑи блока
try {...}. - ÐÑли в нÑм Ð½ÐµÑ Ð¾Ñибок, Ñо блок
catch(err)игноÑиÑÑеÑÑÑ: вÑполнение Ð´Ð¾Ñ Ð¾Ð´Ð¸Ñ Ð´Ð¾ конÑаtryи поÑом далее, полноÑÑÑÑ Ð¿ÑопÑÑкаÑcatch. - ÐÑли же в нÑм Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка, Ñо вÑполнение
tryпÑеÑÑваеÑÑÑ, и поÑок ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð¸Ñ Ð² наÑалоcatch(err). ÐеÑеменнаÑerr(можно иÑполÑзоваÑÑ Ð»Ñбое имÑ) ÑодеÑÐ¶Ð¸Ñ Ð¾Ð±ÑÐµÐºÑ Ð¾Ñибки Ñ Ð¿Ð¾Ð´Ñобной инÑоÑмаÑией о пÑоизоÑедÑем.
Таким обÑазом, пÑи оÑибке в блоке try {â¦} ÑкÑÐ¸Ð¿Ñ Ð½Ðµ «падаеÑ», и Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем возможноÑÑÑ Ð¾Ð±ÑабоÑаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð²Ð½ÑÑÑи catch.
ÐавайÑе ÑаÑÑмоÑÑим пÑимеÑÑ.
-
ÐÑÐ¸Ð¼ÐµÑ Ð±ÐµÐ· оÑибок: вÑведеÑ
alert(1)и(2):try { alert('ÐаÑало блока try'); // (1) <-- // ...код без оÑибок alert('ÐÐ¾Ð½ÐµÑ Ð±Ð»Ð¾ÐºÐ° try'); // (2) <-- } catch(err) { alert('Catch игноÑиÑÑеÑÑÑ, Ñак как Ð½ÐµÑ Ð¾Ñибок'); // (3) } -
ÐÑÐ¸Ð¼ÐµÑ Ñ Ð¾Ñибками: вÑведеÑ
(1)и(3):try { alert('ÐаÑало блока try'); // (1) <-- lalala; // оÑибка, пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð½Ðµ опÑеделена! alert('ÐÐ¾Ð½ÐµÑ Ð±Ð»Ð¾ÐºÐ° try (никогда не вÑполниÑÑÑ)'); // (2) } catch(err) { alert(`Ðозникла оÑибка!`); // (3) <-- }
try..catch ÑабоÑÐ°ÐµÑ ÑолÑко Ð´Ð»Ñ Ð¾Ñибок, возникаÑÑиÑ
во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°Ð§ÑÐ¾Ð±Ñ try..catch ÑабоÑал, код должен бÑÑÑ Ð²ÑполнимÑм. ÐÑÑгими Ñловами, ÑÑо должен бÑÑÑ ÐºÐ¾ÑÑекÑнÑй JavaScript-код.
Ðн не ÑÑабоÑаеÑ, еÑли код ÑинÑакÑиÑеÑки невеÑен, напÑимеÑ, ÑодеÑÐ¶Ð¸Ñ Ð½ÐµÑовпадаÑÑее колиÑеÑÑво ÑигÑÑнÑÑ Ñкобок:
try {
{{{{{{{{{{{{
} catch(e) {
alert("Ðвижок не Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð½ÑÑÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´, он некоÑÑекÑен");
}
JavaScript-движок ÑнаÑала ÑиÑÐ°ÐµÑ ÐºÐ¾Ð´, а заÑем иÑполнÑÐµÑ ÐµÐ³Ð¾. ÐÑибки, коÑоÑÑе возникаÑÑ Ð²Ð¾ вÑÐµÐ¼Ñ ÑÐ°Ð·Ñ ÑÑениÑ, назÑваÑÑÑÑ Ð¾Ñибками паÑÑинга. ÐÑ Ð½ÐµÐ»ÑÐ·Ñ Ð¾Ð±ÑабоÑаÑÑ (изнÑÑÑи ÑÑого кода), поÑÐ¾Ð¼Ñ ÑÑо движок не Ð¿Ð¾Ð½Ð¸Ð¼Ð°ÐµÑ ÐºÐ¾Ð´.
Таким обÑазом, try..catch Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ ÑолÑко оÑибки, коÑоÑÑе возникаÑÑ Ð² коÑÑекÑном коде. Такие оÑибки назÑваÑÑ Â«Ð¾Ñибками во вÑÐµÐ¼Ñ Ð²ÑполнениÑ», а иногда «иÑклÑÑениÑми».
try..catch ÑабоÑÐ°ÐµÑ ÑинÑ
ÑонноÐÑклÑÑение, коÑоÑое пÑоизойдÑÑ Ð² коде, запланиÑованном «на бÑдÑÑее», напÑÐ¸Ð¼ÐµÑ Ð² setTimeout, try..catch не поймаеÑ:
try {
setTimeout(function() {
noSuchVariable; // ÑкÑÐ¸Ð¿Ñ ÑпадÑÑ ÑÑÑ
}, 1000);
} catch (e) {
alert( "не ÑÑабоÑаеÑ" );
}
ÐÑо поÑомÑ, ÑÑо ÑÑнкÑÐ¸Ñ Ð²ÑполнÑеÑÑÑ Ð¿Ð¾Ð·Ð¶Ðµ, когда движок Ñже покинÑл конÑÑÑÑкÑÐ¸Ñ try..catch.
ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð¹Ð¼Ð°ÑÑ Ð¸ÑклÑÑение внÑÑÑи запланиÑованной ÑÑнкÑии, try..catch должен наÑ
одиÑÑÑÑ Ð²Ð½ÑÑÑи Ñамой ÑÑой ÑÑнкÑии:
setTimeout(function() {
try {
noSuchVariable; // try..catch обÑабаÑÑÐ²Ð°ÐµÑ Ð¾ÑибкÑ!
} catch {
alert( "оÑибка поймана!" );
}
}, 1000);
ÐбÑÐµÐºÑ Ð¾Ñибки
Ðогда Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка, JavaScript генеÑиÑÑÐµÑ Ð¾Ð±ÑекÑ, ÑодеÑжаÑий ÐµÑ Ð´ÐµÑали. ÐаÑем ÑÑÐ¾Ñ Ð¾Ð±ÑÐµÐºÑ Ð¿ÐµÑедаÑÑÑÑ ÐºÐ°Ðº аÑгÑÐ¼ÐµÐ½Ñ Ð² блок catch:
try {
// ...
} catch(err) { // <-- обÑÐµÐºÑ Ð¾Ñибки, можно иÑполÑзоваÑÑ Ð´ÑÑгое название вмеÑÑо err
// ...
}
ÐÐ»Ñ Ð²ÑÐµÑ Ð²ÑÑÑоеннÑÑ Ð¾Ñибок ÑÑÐ¾Ñ Ð¾Ð±ÑÐµÐºÑ Ð¸Ð¼ÐµÐµÑ Ð´Ð²Ð° оÑновнÑÑ ÑвойÑÑва:
name- ÐÐ¼Ñ Ð¾Ñибки. ÐапÑимеÑ, Ð´Ð»Ñ Ð½ÐµÐ¾Ð¿ÑеделÑнной пеÑеменной ÑÑо
"ReferenceError". message- ТекÑÑовое ÑообÑение о деÑалÑÑ Ð¾Ñибки.
РболÑÑинÑÑве окÑÑжений доÑÑÑÐ¿Ð½Ñ Ð¸ дÑÑгие, неÑÑандаÑÑнÑе ÑвойÑÑва. Ðдно из ÑамÑÑ ÑиÑоко иÑполÑзÑемÑÑ Ð¸ поддеÑживаемÑÑ â ÑÑо:
stack- ТекÑÑий ÑÑек вÑзова: ÑÑÑока, ÑодеÑжаÑÐ°Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ поÑледоваÑелÑноÑÑи вложеннÑÑ Ð²Ñзовов, коÑоÑÑе пÑивели к оÑибке. ÐÑполÑзÑеÑÑÑ Ð² ÑелÑÑ Ð¾Ñладки.
ÐапÑимеÑ:
try {
lalala; // оÑибка, пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð½Ðµ опÑеделена!
} catch(err) {
alert(err.name); // ReferenceError
alert(err.message); // lalala is not defined
alert(err.stack); // ReferenceError: lalala is not defined at (...ÑÑек вÑзовов)
// Ðожем Ñакже пÑоÑÑо вÑвеÑÑи оÑÐ¸Ð±ÐºÑ Ñеликом
// ÐÑибка пÑиводиÑÑÑ Ðº ÑÑÑоке вида "name: message"
alert(err); // ReferenceError: lalala is not defined
}
Ðлок «catch» без пеÑеменной
ÐÑли нам не нÑÐ¶Ð½Ñ Ð´ÐµÑали оÑибки, в catch можно ÐµÑ Ð¿ÑопÑÑÑиÑÑ:
try {
// ...
} catch { // <-- без (err)
// ...
}
ÐÑполÑзование «tryâ¦catch»
ÐавайÑе ÑаÑÑмоÑÑим ÑеалÑнÑе ÑлÑÑаи иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ try..catch.
Ðак Ð¼Ñ Ñже знаем, JavaScript поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ Ð¼ÐµÑод JSON.parse(str) Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ JSON.
ÐбÑÑно он иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð´ÐµÐºÐ¾Ð´Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ , полÑÑеннÑÑ Ð¿Ð¾ ÑеÑи, Ð¾Ñ ÑеÑвеÑа или из дÑÑгого иÑÑоÑника.
ÐÑ Ð¿Ð¾Ð»ÑÑаем иÑ
и вÑзÑваем JSON.parse Ð²Ð¾Ñ Ñак:
let json = '{"name":"John", "age": 30}'; // даннÑе Ñ ÑеÑвеÑа
let user = JSON.parse(json); // пÑеобÑазовали ÑекÑÑовое пÑедÑÑавление в JS-обÑекÑ
// ÑепеÑÑ user - обÑÐµÐºÑ Ñо ÑвойÑÑвами из ÑÑÑоки
alert( user.name ); // John
alert( user.age ); // 30
ÐÑ Ð¼Ð¾Ð¶ÐµÑе найÑи более деÑалÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ JSON в главе ФоÑÐ¼Ð°Ñ JSON, меÑод toJSON.
ÐÑли json некоÑÑекÑен, JSON.parse генеÑиÑÑÐµÑ Ð¾ÑибкÑ, Ñо еÑÑÑ ÑкÑÐ¸Ð¿Ñ Â«Ð¿Ð°Ð´Ð°ÐµÑ».
УÑÑÑÐ¾Ð¸Ñ Ð»Ð¸ Ð½Ð°Ñ Ñакое поведение? ÐонеÑно неÑ!
ÐолÑÑаеÑÑÑ, ÑÑо еÑли вдÑÑг ÑÑо-Ñо не Ñак Ñ Ð´Ð°Ð½Ð½Ñми, Ñо поÑеÑиÑÐµÐ»Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° (еÑли, конеÑно, не оÑкÑÐ¾ÐµÑ ÐºÐ¾Ð½ÑолÑ) об ÑÑом не ÑзнаеÑ. РлÑди оÑÐµÐ½Ñ Ð½Ðµ лÑбÑÑ, когда ÑÑо-Ñо «пÑоÑÑо падаеÑ» без вÑÑкого ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке.
ÐавайÑе иÑполÑзÑем try..catch Ð´Ð»Ñ Ð¾Ð±ÑабоÑки оÑибки:
let json = "{ некоÑÑекÑнÑй JSON }";
try {
let user = JSON.parse(json); // <-- ÑÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка...
alert( user.name ); // не ÑÑабоÑаеÑ
} catch (e) {
// ...вÑполнение пÑÑÐ³Ð°ÐµÑ ÑÑда
alert( "ÐзвиниÑе, в даннÑÑ
оÑибка, Ð¼Ñ Ð¿Ð¾Ð¿ÑобÑем полÑÑиÑÑ Ð¸Ñ
еÑÑ Ñаз." );
alert( e.name );
alert( e.message );
}
ÐдеÑÑ Ð¼Ñ Ð¸ÑполÑзÑем блок catch ÑолÑко Ð´Ð»Ñ Ð²Ñвода ÑообÑениÑ, но Ð¼Ñ Ñакже можем ÑделаÑÑ Ð³Ð¾Ñаздо болÑÑе: оÑпÑавиÑÑ Ð½Ð¾Ð²Ñй ÑеÑевой запÑоÑ, пÑедложиÑÑ Ð¿Ð¾ÑеÑиÑÐµÐ»Ñ Ð°Ð»ÑÑеÑнаÑивнÑй ÑпоÑоб, оÑоÑлаÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± оÑибке на ÑеÑÐ²ÐµÑ Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸ÑованиÑ, ⦠ÐÑÑ Ð»ÑÑÑе, Ñем пÑоÑÑо «падение».
ÐенеÑаÑÐ¸Ñ ÑобÑÑвеннÑÑ Ð¾Ñибок
ЧÑо еÑли json ÑинÑакÑиÑеÑки коÑÑекÑен, но не ÑодеÑÐ¶Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ
одимого ÑвойÑÑва name?
ÐапÑимеÑ, Ñак:
let json = '{ "age": 30 }'; // даннÑе неполнÑ
try {
let user = JSON.parse(json); // <-- вÑполниÑÑÑ Ð±ÐµÐ· оÑибок
alert( user.name ); // Ð½ÐµÑ ÑвойÑÑва name!
} catch (e) {
alert( "не вÑполниÑÑÑ" );
}
ÐдеÑÑ JSON.parse вÑполниÑÑÑ Ð±ÐµÐ· оÑибок, но на Ñамом деле оÑÑÑÑÑÑвие ÑвойÑÑва name Ð´Ð»Ñ Ð½Ð°Ñ Ð¾Ñибка.
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ ÑниÑиÑиÑоваÑÑ Ð¾Ð±ÑабоÑÐºÑ Ð¾Ñибок, Ð¼Ñ Ð²Ð¾ÑполÑзÑемÑÑ Ð¾Ð¿ÐµÑаÑоÑом throw.
ÐпеÑаÑÐ¾Ñ Â«throw»
ÐпеÑаÑÐ¾Ñ throw генеÑиÑÑÐµÑ Ð¾ÑибкÑ.
СинÑакÑиÑ:
throw <обÑÐµÐºÑ Ð¾Ñибки>
ТеÑ
ниÑеÑки в каÑеÑÑве обÑекÑа оÑибки можно пеÑедаÑÑ ÑÑо Ñгодно. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð°Ð¶Ðµ пÑимиÑив, ÑиÑло или ÑÑÑока, но вÑÑ Ð¶Ðµ лÑÑÑе, ÑÑÐ¾Ð±Ñ ÑÑо бÑл обÑекÑ, желаÑелÑно Ñо ÑвойÑÑвами name и message (Ð´Ð»Ñ ÑовмеÑÑимоÑÑи Ñо вÑÑÑоеннÑми оÑибками).
Ð JavaScript еÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво вÑÑÑоеннÑÑ
конÑÑÑÑкÑоÑов Ð´Ð»Ñ ÑÑандаÑÑнÑÑ
оÑибок: Error, SyntaxError, ReferenceError, TypeError и дÑÑгие. Ðожно иÑполÑзоваÑÑ Ð¸ иÑ
Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов оÑибки.
ÐÑ ÑинÑакÑиÑ:
let error = new Error(message);
// или
let error = new SyntaxError(message);
let error = new ReferenceError(message);
// ...
ÐÐ»Ñ Ð²ÑÑÑоеннÑÑ
оÑибок (не Ð´Ð»Ñ Ð»ÑбÑÑ
обÑекÑов, ÑолÑко Ð´Ð»Ñ Ð¾Ñибок), ÑвойÑÑво name â ÑÑо в ÑоÑноÑÑи Ð¸Ð¼Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа. Ð ÑвойÑÑво message беÑÑÑÑÑ Ð¸Ð· аÑгÑменÑа.
ÐапÑимеÑ:
let error = new Error("Ðго, оÑибка! o_O");
alert(error.name); // Error
alert(error.message); // Ðго, оÑибка! o_O
ÐавайÑе поÑмоÑÑим, какÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð³ÐµÐ½ÐµÑиÑÑÐµÑ JSON.parse:
try {
JSON.parse("{ некоÑÑекÑнÑй json o_O }");
} catch(e) {
alert(e.name); // SyntaxError
alert(e.message); // Expected property name or '}' in JSON at position 2 (line 1 column 3)
}
Ðак Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, ÑÑо SyntaxError.
РнаÑем ÑлÑÑае оÑÑÑÑÑÑвие ÑвойÑÑва name â ÑÑо оÑибка, Ð²ÐµÐ´Ñ Ð¿Ð¾Ð»ÑзоваÑели Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸Ð¼ÐµÑÑ Ð¸Ð¼ÐµÐ½Ð°.
СгенеÑиÑÑем еÑ:
let json = '{ "age": 30 }'; // даннÑе неполнÑ
try {
let user = JSON.parse(json); // <-- вÑполниÑÑÑ Ð±ÐµÐ· оÑибок
if (!user.name) {
throw new SyntaxError("ÐаннÑе неполнÑ: Ð½ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸"); // (*)
}
alert( user.name );
} catch(e) {
alert( "JSON Error: " + e.message ); // JSON Error: ÐаннÑе неполнÑ: Ð½ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸
}
Ð ÑÑÑоке (*) опеÑаÑÐ¾Ñ throw генеÑиÑÑÐµÑ Ð¾ÑÐ¸Ð±ÐºÑ SyntaxError Ñ ÑообÑением message. ТоÑно Ñакого же вида, как генеÑиÑÑÐµÑ Ñам JavaScript. ÐÑполнение блока try немедленно оÑÑанавливаеÑÑÑ, и поÑок ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿ÑÑÐ³Ð°ÐµÑ Ð² catch.
ТепеÑÑ Ð±Ð»Ð¾Ðº catch ÑÑановиÑÑÑ ÐµÐ´Ð¸Ð½ÑÑвеннÑм меÑÑом Ð´Ð»Ñ Ð¾Ð±ÑабоÑки вÑеÑ
оÑибок: и Ð´Ð»Ñ JSON.parse и Ð´Ð»Ñ Ð´ÑÑгиÑ
ÑлÑÑаев.
ÐÑобÑÐ¾Ñ Ð¸ÑклÑÑениÑ
РпÑимеÑе вÑÑе Ð¼Ñ Ð¸ÑполÑзовали try..catch Ð´Ð»Ñ Ð¾Ð±ÑабоÑки некоÑÑекÑнÑÑ
даннÑÑ
. Ð ÑÑо, еÑли в блоке try {...} Ð²Ð¾Ð·Ð½Ð¸ÐºÐ½ÐµÑ Ð´ÑÑÐ³Ð°Ñ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð¾Ñибка? ÐапÑимеÑ, пÑогÑÐ°Ð¼Ð¼Ð½Ð°Ñ (неопÑеделÑÐ½Ð½Ð°Ñ Ð¿ÐµÑеменнаÑ) или какаÑ-Ñо еÑÑ, а не оÑибка, ÑвÑÐ·Ð°Ð½Ð½Ð°Ñ Ñ Ð½ÐµÐºÐ¾ÑÑекÑнÑми даннÑми.
ÐÑимеÑ:
let json = '{ "age": 30 }'; // даннÑе неполнÑ
try {
user = JSON.parse(json); // <-- забÑл добавиÑÑ "let" пеÑед user
// ...
} catch(err) {
alert("JSON Error: " + err); // JSON Error: ReferenceError: user is not defined
// (не JSON оÑибка на Ñамом деле)
}
ÐонеÑно, возможно вÑе! ÐÑогÑаммиÑÑÑ ÑовеÑÑаÑÑ Ð¾Ñибки. Ðаже в ÑÑилиÑÐ°Ñ Ñ Ð¾ÑкÑÑÑÑм иÑÑ Ð¾Ð´Ð½Ñм кодом, иÑполÑзÑемÑÑ Ð¼Ð¸Ð»Ð»Ð¸Ð¾Ð½Ð°Ð¼Ð¸ лÑдей на пÑоÑÑжении деÑÑÑилеÑий â вдÑÑг Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾Ð±Ð½Ð°ÑÑжена оÑибка, коÑоÑÐ°Ñ Ð¿ÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº ÑжаÑнÑм взломам.
РнаÑем ÑлÑÑае try..catch пÑедназнаÑен Ð´Ð»Ñ Ð²ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¾Ñибок, ÑвÑзаннÑÑ
Ñ Ð½ÐµÐºÐ¾ÑÑекÑнÑми даннÑми. Ðо по Ñвоей пÑиÑоде catch полÑÑÐ°ÐµÑ Ð²Ñе Ñвои оÑибки из try. ÐдеÑÑ Ð¾Ð½ полÑÑÐ°ÐµÑ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½ÑÑ Ð¾ÑибкÑ, но вÑÑ Ñакже показÑÐ²Ð°ÐµÑ Ñо же Ñамое ÑообÑение "JSON Error". ÐÑо непÑавилÑно и заÑÑÑднÑÐµÑ Ð¾ÑÐ»Ð°Ð´ÐºÑ ÐºÐ¾Ð´Ð°.
Ð ÑÑаÑÑÑÑ, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑÑÑниÑÑ, какÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð¼Ñ Ð¿Ð¾Ð»ÑÑили, напÑимеÑ, по ÐµÑ ÑвойÑÑÐ²Ñ name:
try {
user = { /*...*/ };
} catch(e) {
alert(e.name); // "ReferenceError" из-за неопÑеделÑнной пеÑеменной
}
ÐÑÑÑ Ð¿ÑоÑÑое пÑавило:
Ðлок catch должен обÑабаÑÑваÑÑ ÑолÑко Ñе оÑибки, коÑоÑÑе ÐµÐ¼Ñ Ð¸Ð·Ð²ÐµÑÑнÑ, и «пÑобÑаÑÑваÑÑ» вÑе оÑÑалÑнÑе.
Ð¢ÐµÑ Ð½Ð¸ÐºÐ° «пÑобÑÐ¾Ñ Ð¸ÑклÑÑениÑ» вÑглÑÐ´Ð¸Ñ Ñак:
- Ðлок
catchполÑÑÐ°ÐµÑ Ð²Ñе оÑибки. - Рблоке
catch(err) {...}Ð¼Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð¸ÑÑем обÑÐµÐºÑ Ð¾Ñибкиerr. - ÐÑли Ð¼Ñ Ð½Ðµ знаем как ÐµÑ Ð¾Ð±ÑабоÑаÑÑ, Ñогда делаем
throw err.
Ркоде ниже Ð¼Ñ Ð¸ÑполÑзÑем пÑобÑÐ¾Ñ Ð¸ÑклÑÑениÑ, catch обÑабаÑÑÐ²Ð°ÐµÑ ÑолÑко SyntaxError:
let json = '{ "age": 30 }'; // даннÑе неполнÑ
try {
let user = JSON.parse(json);
if (!user.name) {
throw new SyntaxError("ÐаннÑе неполнÑ: Ð½ÐµÑ Ð¸Ð¼ÐµÐ½Ð¸");
}
blabla(); // Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð°Ñ Ð¾Ñибка
alert( user.name );
} catch(e) {
if (e.name == "SyntaxError") {
alert( "JSON Error: " + e.message );
} else {
throw e; // пÑобÑÐ¾Ñ (*)
}
}
ÐÑибка в ÑÑÑоке (*) из блока catch «вÑÐ¿Ð°Ð´Ð°ÐµÑ Ð½Ð°ÑÑжÑ» и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð¹Ð¼Ð°Ð½Ð° дÑÑгой внеÑней конÑÑÑÑкÑией try..catch (еÑли еÑÑÑ), или «ÑбÑÑÑ» ÑкÑипÑ.
Таким обÑазом, блок catch ÑакÑиÑеÑки обÑабаÑÑÐ²Ð°ÐµÑ ÑолÑко Ñе оÑибки, Ñ ÐºÐ¾ÑоÑÑми он знаеÑ, как ÑпÑавлÑÑÑÑÑ, и пÑопÑÑÐºÐ°ÐµÑ Ð¾ÑÑалÑнÑе.
ÐÑÐ¸Ð¼ÐµÑ Ð½Ð¸Ð¶Ðµ демонÑÑÑиÑÑеÑ, как Ñакие оÑибки могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð¹Ð¼Ð°Ð½Ñ Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐµÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑÐ¾Ð²Ð½Ñ try..catch:
function readData() {
let json = '{ "age": 30 }';
try {
// ...
blabla(); // оÑибка!
} catch (e) {
// ...
if (e.name != 'SyntaxError') {
throw e; // пÑобÑÐ¾Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ (не Ð·Ð½Ð°Ñ ÐºÐ°Ðº ÑÑо обÑабоÑаÑÑ)
}
}
}
try {
readData();
} catch (e) {
alert( "ÐнеÑний catch поймал: " + e ); // поймал!
}
ÐдеÑÑ readData Ð·Ð½Ð°ÐµÑ ÑолÑко, как обÑабоÑаÑÑ SyntaxError, Ñогда как внеÑний блок try..catch знаеÑ, как обÑабоÑаÑÑ Ð²ÑÑ.
tryâ¦catchâ¦finally
ÐодождиÑе, ÑÑо еÑÑ Ð½Ðµ вÑÑ.
ÐонÑÑÑÑкÑÐ¸Ñ try..catch Ð¼Ð¾Ð¶ÐµÑ ÑодеÑжаÑÑ ÐµÑÑ Ð¾Ð´Ð½Ñ ÑекÑиÑ: finally.
ÐÑли ÑекÑÐ¸Ñ ÐµÑÑÑ, Ñо она вÑполнÑеÑÑÑ Ð² лÑбом ÑлÑÑае:
- поÑле
try, еÑли не бÑло оÑибок, - поÑле
catch, еÑли оÑибки бÑли.
РаÑÑиÑеннÑй ÑинÑакÑÐ¸Ñ Ð²ÑглÑÐ´Ð¸Ñ ÑледÑÑÑим обÑазом:
try {
... пÑобÑем вÑполниÑÑ ÐºÐ¾Ð´...
} catch(e) {
... обÑабаÑÑваем оÑибки ...
} finally {
... вÑполнÑем вÑегда ...
}
ÐопÑобÑйÑе запÑÑÑиÑÑ Ñакой код:
try {
alert( 'try' );
if (confirm('СгенеÑиÑоваÑÑ Ð¾ÑибкÑ?')) BAD_CODE();
} catch (e) {
alert( 'catch' );
} finally {
alert( 'finally' );
}
У кода еÑÑÑ Ð´Ð²Ð° пÑÑи вÑполнениÑ:
- ÐÑли Ð²Ñ Ð¾ÑвеÑиÑе на вопÑÐ¾Ñ Â«Ð¡Ð³ÐµÐ½ÐµÑиÑоваÑÑ Ð¾ÑибкÑ?» ÑÑвеÑдиÑелÑно, Ñо
try -> catch -> finally. - ÐÑли оÑвеÑиÑе оÑÑиÑаÑелÑно, Ñо
try -> finally.
СекÑÐ¸Ñ finally ÑаÑÑо иÑполÑзÑÑÑ, когда Ð¼Ñ Ð½Ð°Ñали ÑÑо-Ñо делаÑÑ Ð¸ Ñ
оÑим завеÑÑиÑÑ ÑÑо вне завиÑимоÑÑи Ð¾Ñ Ñого, бÑÐ´ÐµÑ Ð¾Ñибка или неÑ.
ÐапÑимеÑ, Ð¼Ñ Ñ
оÑим измеÑиÑÑ Ð²ÑемÑ, коÑоÑое Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ ÑÑнкÑÐ¸Ñ ÑиÑел ФибонаÑÑи fib(n). ÐÑÑеÑÑвенно, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ наÑаÑÑ Ð¸Ð·Ð¼ÐµÑÐµÐ½Ð¸Ñ Ð´Ð¾ Ñого, как ÑÑнкÑÐ¸Ñ Ð½Ð°ÑнÑÑ Ð²ÑполнÑÑÑÑÑ Ð¸ законÑиÑÑ Ð¿Ð¾Ñле. Ðо ÑÑо делаÑÑ, еÑли пÑи вÑзове ÑÑнкÑии возникла оÑибка? Ð ÑаÑÑноÑÑи, ÑеализаÑÐ¸Ñ fib(n) в коде ниже возвÑаÑÐ°ÐµÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð´Ð»Ñ Ð¾ÑÑиÑаÑелÑнÑÑ
и Ð´Ð»Ñ Ð½ÐµÑелÑÑ
ÑиÑел.
СекÑÐ¸Ñ finally оÑлиÑно подÑ
Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÑений неÑмоÑÑÑ Ð½Ð¸ на ÑÑо.
ÐдеÑÑ finally гаÑанÑиÑÑеÑ, ÑÑо вÑÐµÐ¼Ñ Ð±ÑÐ´ÐµÑ Ð¸Ð·Ð¼ÐµÑено коÑÑекÑно в обеиÑ
ÑиÑÑаÑиÑÑ
â и в ÑлÑÑае ÑÑпеÑного завеÑÑÐµÐ½Ð¸Ñ fib и в ÑлÑÑае оÑибки:
let num = +prompt("ÐведиÑе положиÑелÑное Ñелое ÑиÑло?", 35)
let diff, result;
function fib(n) {
if (n < 0 || Math.trunc(n) != n) {
throw new Error("Ðолжно бÑÑÑ Ñелое неоÑÑиÑаÑелÑное ÑиÑло");
}
return n <= 1 ? n : fib(n - 1) + fib(n - 2);
}
let start = Date.now();
try {
result = fib(num);
} catch (e) {
result = 0;
} finally {
diff = Date.now() - start;
}
alert(result || "возникла оÑибка");
alert( `ÐÑполнение занÑло ${diff}ms` );
ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑÑо пÑовеÑиÑÑ, запÑÑÑив ÑÑÐ¾Ñ ÐºÐ¾Ð´ и Ð²Ð²ÐµÐ´Ñ 35 в prompt â код завеÑÑиÑÑÑ Ð½Ð¾ÑмалÑно, finally вÑполниÑÑÑ Ð¿Ð¾Ñле try. РзаÑем введиÑе -1 â незамедлиÑелÑно пÑоизойдÑÑ Ð¾Ñибка, вÑполнение займÑÑ 0ms. Ðба измеÑÐµÐ½Ð¸Ñ Ð²ÑполнÑÑÑÑÑ ÐºÐ¾ÑÑекÑно.
ÐÑÑгими Ñловами, неважно как завеÑÑилаÑÑ ÑÑнкÑиÑ: ÑеÑез return или throw. СекÑÐ¸Ñ finally ÑÑабаÑÑÐ²Ð°ÐµÑ Ð² обоиÑ
ÑлÑÑаÑÑ
.
try..catch..finally локалÑнÑÐбÑаÑиÑе внимание, ÑÑо пеÑеменнÑе result и diff в коде вÑÑе обÑÑÐ²Ð»ÐµÐ½Ñ Ð´Ð¾ try..catch.
ÐÑли пеÑеменнÑÑ Ð¾Ð±ÑÑвиÑÑ Ð² блоке, напÑимеÑ, в try, Ñо она не бÑÐ´ÐµÑ Ð´Ð¾ÑÑÑпна поÑле него.
finally и returnÐлок finally ÑÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ñи лÑбом вÑÑ
оде из try..catch, в Ñом ÑиÑле и return.
РпÑимеÑе ниже из try пÑоиÑÑ
Ð¾Ð´Ð¸Ñ return, но finally полÑÑÐ°ÐµÑ ÑпÑавление до Ñого, как конÑÑÐ¾Ð»Ñ Ð²Ð¾Ð·Ð²ÑаÑаеÑÑÑ Ð²Ð¾ внеÑний код.
function func() {
try {
return 1;
} catch (e) {
/* ... */
} finally {
alert( 'finally' );
}
}
alert( func() ); // ÑнаÑала ÑÑабаÑÑÐ²Ð°ÐµÑ alert из finally, а заÑем ÑÑÐ¾Ñ ÐºÐ¾Ð´
try..finallyÐонÑÑÑÑкÑÐ¸Ñ try..finally без ÑекÑии catch Ñакже полезна. ÐÑ Ð¿ÑименÑем еÑ, когда не Ñ
оÑим здеÑÑ Ð¾Ð±ÑабаÑÑваÑÑ Ð¾Ñибки (пÑÑÑÑ Ð²ÑпадÑÑ), но Ñ
оÑим бÑÑÑ ÑвеÑенÑ, ÑÑо наÑаÑÑе пÑоÑеÑÑÑ Ð·Ð°Ð²ÐµÑÑилиÑÑ.
function func() {
// наÑаÑÑ Ð´ÐµÐ»Ð°ÑÑ ÑÑо-Ñо, ÑÑо ÑÑебÑÐµÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ (напÑимеÑ, измеÑениÑ)
try {
// ...
} finally {
// завеÑÑиÑÑ ÑÑо, даже еÑли вÑе ÑпадÑÑ
}
}
РпÑиведÑнном вÑÑе коде оÑибка вÑегда вÑÐ¿Ð°Ð´Ð°ÐµÑ Ð½Ð°ÑÑжÑ, поÑÐ¾Ð¼Ñ ÑÑо ÑÑÑ Ð½ÐµÑ Ð±Ð»Ð¾ÐºÐ° catch. Ðо finally оÑÑабаÑÑÐ²Ð°ÐµÑ Ð´Ð¾ Ñого, как поÑок ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÑÐ¹Ð´ÐµÑ Ð¸Ð· ÑÑнкÑии.
ÐлобалÑнÑй catch
ÐнÑоÑмаÑÐ¸Ñ Ð¸Ð· данной ÑекÑии не ÑвлÑеÑÑÑ ÑаÑÑÑÑ ÑзÑка JavaScript.
ÐавайÑе пÑедÑÑавим, ÑÑо пÑоизоÑла ÑаÑалÑÐ½Ð°Ñ Ð¾Ñибка (пÑогÑÐ°Ð¼Ð¼Ð½Ð°Ñ Ð¸Ð»Ð¸ ÑÑо-Ñо еÑÑ ÑжаÑное) ÑнаÑÑжи try..catch, и ÑкÑÐ¸Ð¿Ñ Ñпал.
СÑÑеÑÑвÑÐµÑ Ð»Ð¸ ÑпоÑоб оÑÑеагиÑоваÑÑ Ð½Ð° Ñакие ÑиÑÑаÑии? ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ Ð·Ð°Ñ Ð¾ÑеÑÑ Ð·Ð°Ð»Ð¾Ð³Ð¸ÑоваÑÑ Ð¾ÑибкÑ, показаÑÑ ÑÑо-Ñо полÑзоваÑÐµÐ»Ñ (обÑÑно они не видÑÑ ÑообÑение об оÑибке) и Ñ.д.
Такого ÑпоÑоба Ð½ÐµÑ Ð² ÑпеÑиÑикаÑии, но обÑÑно окÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¿ÑедоÑÑавлÑÑÑ ÐµÐ³Ð¾, поÑÐ¾Ð¼Ñ ÑÑо ÑÑо веÑÑма полезно. ÐапÑимеÑ, в Node.js Ð´Ð»Ñ ÑÑого еÑÑÑ process.on("uncaughtException"). Рв бÑаÑзеÑе Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пÑиÑвоиÑÑ ÑÑнкÑÐ¸Ñ ÑпеÑиалÑÐ½Ð¾Ð¼Ñ ÑвойÑÑÐ²Ñ window.onerror, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²Ñзвана в ÑлÑÑае необÑабоÑанной оÑибки.
СинÑакÑиÑ:
window.onerror = function(message, url, line, col, error) {
// ...
};
message- СообÑение об оÑибке.
url- URL ÑкÑипÑа, в коÑоÑом пÑоизоÑла оÑибка.
line,col- ÐомеÑа ÑÑÑоки и ÑÑолбÑа, в коÑоÑÑÑ Ð¿ÑоизоÑла оÑибка.
error- ÐбÑÐµÐºÑ Ð¾Ñибки.
ÐÑимеÑ:
<script>
window.onerror = function(message, url, line, col, error) {
alert(`${message}\n Р${line}:${col} на ${url}`);
};
function readData() {
badFunc(); // Ðй, ÑÑо-Ñо поÑло не Ñак!
}
readData();
</script>
Ð Ð¾Ð»Ñ Ð³Ð»Ð¾Ð±Ð°Ð»Ñного обÑабоÑÑика window.onerror обÑÑно заклÑÑаеÑÑÑ Ð½Ðµ в воÑÑÑановлении вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑкÑипÑа â ÑÑо ÑкоÑее вÑего невозможно в ÑлÑÑае пÑогÑаммной оÑибки, а в оÑпÑавке ÑообÑÐµÐ½Ð¸Ñ Ð¾Ð± оÑибке ÑазÑабоÑÑикам.
СÑÑеÑÑвÑÑÑ Ñакже веб-ÑеÑвиÑÑ, коÑоÑÑе пÑедоÑÑавлÑÑÑ Ð»Ð¾Ð³Ð¸Ñование оÑибок Ð´Ð»Ñ ÑÐ°ÐºÐ¸Ñ ÑлÑÑаев, Ñакие как https://www.muscula.com.
Ðни ÑабоÑаÑÑ Ñак:
- ÐÑ ÑегиÑÑÑиÑÑемÑÑ Ð² ÑеÑвиÑе и полÑÑаем неболÑÑой JS-ÑкÑÐ¸Ð¿Ñ (или URL ÑкÑипÑа) Ð¾Ñ Ð½Ð¸Ñ Ð´Ð»Ñ Ð²ÑÑавки на ÑÑÑаниÑÑ.
- ÐÑÐ¾Ñ JS-ÑкÑÐ¸Ð¿Ñ ÑÑÐ°Ð²Ð¸Ñ ÑÐ²Ð¾Ñ ÑÑнкÑиÑ
window.onerror. - Ðогда Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ Ð¾Ñибка, она вÑполнÑеÑÑÑ Ð¸ оÑпÑавлÑÐµÑ ÑеÑевой запÑÐ¾Ñ Ñ Ð¸Ð½ÑоÑмаÑией о ней в ÑеÑвиÑ.
- ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ войÑи в веб-инÑеÑÑÐµÐ¹Ñ ÑеÑвиÑа и ÑвидеÑÑ Ð¾Ñибки.
ÐÑого
ÐонÑÑÑÑкÑÐ¸Ñ try..catch позволÑÐµÑ Ð¾Ð±ÑабаÑÑваÑÑ Ð¾Ñибки во вÑÐµÐ¼Ñ Ð¸ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°. Ðна позволÑÐµÑ Ð·Ð°Ð¿ÑÑÑиÑÑ ÐºÐ¾Ð´ и пеÑеÑ
ваÑиÑÑ Ð¾Ñибки, коÑоÑÑе могÑÑ Ð² нÑм возникнÑÑÑ.
СинÑакÑиÑ:
try {
// иÑполнÑем код
} catch(err) {
// еÑли ÑлÑÑилаÑÑ Ð¾Ñибка, пÑÑгаем ÑÑда
// err - ÑÑо обÑÐµÐºÑ Ð¾Ñибки
} finally {
// вÑполнÑеÑÑÑ Ð²Ñегда поÑле try/catch
}
СекÑий catch или finally Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ бÑÑÑ, Ñо еÑÑÑ Ð±Ð¾Ð»ÐµÐµ коÑоÑкие конÑÑÑÑкÑии try..catch и try..finally Ñакже коÑÑекÑнÑ.
ÐбÑекÑÑ Ð¾Ñибок ÑодеÑÐ¶Ð°Ñ ÑледÑÑÑие ÑвойÑÑва:
messageâ понÑÑное ÑÐµÐ»Ð¾Ð²ÐµÐºÑ ÑообÑение.nameâ ÑÑÑока Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ оÑибки (Ð¸Ð¼Ñ ÐºÐ¾Ð½ÑÑÑÑкÑоÑа оÑибки).stack(неÑÑандаÑÑное, но Ñ Ð¾ÑоÑо поддеÑживаеÑÑÑ) â ÑÑек на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¾Ñибки.
ÐÑли обÑÐµÐºÑ Ð¾Ñибки не нÑжен, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ пÑопÑÑÑиÑÑ ÐµÐ³Ð¾, иÑполÑзÑÑ catch { вмеÑÑо catch(err) {.
ÐÑ Ð¼Ð¾Ð¶ÐµÐ¼ Ñакже генеÑиÑоваÑÑ ÑобÑÑвеннÑе оÑибки, иÑполÑзÑÑ Ð¾Ð¿ÐµÑаÑÐ¾Ñ throw. ÐÑгÑменÑом throw Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑо Ñгодно, но обÑÑно ÑÑо обÑÐµÐºÑ Ð¾Ñибки, наÑледÑемÑй Ð¾Ñ Ð²ÑÑÑоенного клаÑÑа Error. ÐодÑобнее о ÑаÑÑиÑении оÑибок Ñм. в ÑледÑÑÑей главе.
ÐÑобÑÐ¾Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ â ÑÑо оÑÐµÐ½Ñ Ð²Ð°Ð¶Ð½Ñй пÑиÑм обÑабоÑки оÑибок: блок catch обÑÑно Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð¸ знаеÑ, как обÑабоÑаÑÑ Ð¾Ð¿ÑеделÑннÑй Ñип оÑибок, поÑÑÐ¾Ð¼Ñ Ð¾Ð½ должен пÑобÑаÑÑваÑÑ Ð´Ð°Ð»ÑÑе оÑибки, о коÑоÑÑÑ
он не знаеÑ.
Ðаже еÑли Ñ Ð½Ð°Ñ Ð½ÐµÑ try..catch, болÑÑинÑÑво ÑÑед позволÑÑÑ Ð½Ð°ÑÑÑоиÑÑ Â«Ð³Ð»Ð¾Ð±Ð°Ð»ÑнÑй» обÑабоÑÑик оÑибок, ÑÑÐ¾Ð±Ñ Ð»Ð¾Ð²Ð¸ÑÑ Ð¾Ñибки, коÑоÑÑе «вÑпадаÑÑ Ð½Ð°ÑÑжÑ». РбÑаÑзеÑе ÑÑо window.onerror.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)