Хатоҳо ва JSON
Ин барои чӣ лозим аст
Барномаҳо мешикананд: корбар ба ҷойи адад ҳарф ворид кард, сервер додаҳои вайроншуда фиристод, файл нест. Бе
коркард чунин як хато тамоми барномаро қатъ мекунад. Сохтори try … catch имкон медиҳад хаторо дошта, ҳал
кунед, ки чӣ кор кунед: паём нишон диҳед, қимати пешфарз гиред, бори дигар кӯшиш кунед.
Ва JSON — формати асосии мубодилаи додаҳо дар веб: ҷавобҳои сервер дар он меоянд, танзимот дар он нигоҳ дошта мешаванд. Таҳлили JSON-и «бегона» — ҷойи аз ҳама маъмулест, ки коркарди хатоҳо лозим аст, бинобар ин ин мавзӯъҳо якҷояанд.
Хато чист
console.log("оғоз");
const user = null;
console.log(user.name); // TypeError — барнома дар ин ҷо меистад
console.log("анҷом"); // иҷро намешавад
Натиҷа:
оғоз
TypeError: Cannot read properties of null (reading 'name')
Навъҳои аз ҳама маъмули хатоҳо:
| Хато | Кай |
|---|---|
SyntaxError |
код на мувофиқи қоидаҳо навишта шудааст (ё JSON вайрон аст) |
ReferenceError |
муроҷиат ба тағйирёбандаи вуҷуднадошта |
TypeError |
амал ба навъ мувофиқ нест: даъвати на-функсия, .name аз null |
RangeError |
қимат берун аз доираи иҷозатдодашуда |
try … catch
try {
console.log("кӯшиш мекунем");
const user = null;
console.log(user.name);
console.log("ба ин ҷо намерасем");
} catch (error) {
console.log("Доштем:", error.name, "-", error.message);
}
console.log("барнома кор карданро идома медиҳад");
Натиҷа:
кӯшиш мекунем
Доштем: TypeError - Cannot read properties of null (reading 'name')
барнома кор карданро идома медиҳад
Код дар try мисли муқаррарӣ иҷро мешавад. Агар дар он хато рух диҳад, иҷро фавран ба catch меҷаҳад, ва
ба тағйирёбандаи error объекти хато меафтад. Вай name (навъ) ва message (матн) дорад. Агар хато набошад,
catch гузаронида мешавад.
Агар объекти хато лозим набошад, қавсҳоро навиштан шарт нест: catch { … }.
finally
Блоки finally ҳамеша иҷро мешавад — хато буд ё не. Ба он «тозакунӣ»-ро мегузоранд: пӯшидани файл,
пинҳон кардани нишондиҳандаи боркунӣ.
try {
console.log("бор мекунем...");
} catch (e) {
console.log("хато");
} finally {
console.log("спиннерро пинҳон мекунем");
}
Натиҷа:
бор мекунем...
спиннерро пинҳон мекунем
throw — партофтани хатои худ
Функсияҳои худатон ҳам метавонанд дар бораи мушкилот бо «партофтан»-и хато хабар диҳанд:
function buy(price, money) {
if (price > money) {
throw new Error("Пул намерасад");
}
return money - price;
}
try {
console.log(buy(50, 100));
console.log(buy(500, 100));
} catch (e) {
console.log("Хато:", e.message);
}
Натиҷа:
50
Хато: Пул намерасад
throw функсияро мисли return қатъ мекунад, аммо ба ҷойи натиҷа хато «мепарад» — то catch-и наздиктарин
дар занҷири даъватҳо болотар. Навъи мушаххасро ҳам партофтан мумкин аст: new TypeError(…), new RangeError(…).
Танҳо хатоҳои худро доштан
Баъзан як навъи хаторо коркард кардан, ва дигаронро ба пеш гузаронидан лозим аст:
try {
doSomething();
} catch (e) {
if (e instanceof RangeError) {
console.log("ислоҳ мекунем");
} else {
throw e; // аз мо нест — ба пеш мепартоем
}
}
«Ҳама чиз»-ро доштан ва хомӯшона нодида гирифтан — одати бад аст: хатоҳои воқеӣ пинҳон мешаванд.
JSON
JSON (JavaScript Object Notation) — формати матнӣ, ки ба объектҳои JS монанд аст:
{
"name": "Аня",
"age": 15,
"skills": ["html", "css"],
"admin": false,
"pet": null
}
Қоидаҳо аз объектҳои JS сахттаранд: калидҳо ва сатрҳо — танҳо дар нохунакҳои дукарата, баъд аз унсури
охирин вергул нест, шарҳҳо нестанд, функсияҳо ва undefined нестанд.
Объект → сатри JSON: JSON.stringify
const user = { name: "Аня", age: 15, hobbies: ["расмкашӣ"] };
const text = JSON.stringify(user);
console.log(text);
console.log(typeof text);
Натиҷа:
{"name":"Аня","age":15,"hobbies":["расмкашӣ"]}
string
JSON.stringify(obj, null, 2) — баровардани зебо бо фосилаҳои 2-пробелӣ.
Сатри JSON → объект: JSON.parse
const data = JSON.parse('{"title": "Курси JS", "lessons": 16}');
console.log(data.lessons + 1);
Натиҷа:
17
Агар сатр JSON-и дуруст набошад, JSON.parse SyntaxError мепартояд:
try {
JSON.parse("{name: 'Аня'}"); // калид бе нохунак, нохунакҳои якказа
} catch (e) {
console.log(e.name);
}
Натиҷа:
SyntaxError
Ҷуфти JSON.parse(JSON.stringify(obj)) — тарзи кӯҳнаи сохтани нусхаи амиқи объекти оддӣ.
Дар дохил чӣ гуна кор мекунад
Вақте ки хато партофта мешавад, муҳаррик стеки даъватҳоро «мекушояд»: аз функсияи ҷорӣ мебарояд, баъд аз
функсияе, ки онро даъват карда буд, ва ҳамин тавр, то try-ро бо catch ёбад. Агар наёбад — барнома меистад,
ва хато ба консол чоп мешавад. Бинобар ин catch-ро на бевосита дар атрофи сатри хатарнок, балки дар ҷое
гузоштан мумкин аст, ки шумо медонед бо хато чӣ кор кардан лозим.
Объекти хато боз хосияти stack дорад — рӯйхати функсияҳое, ки хато аз онҳо «гузаштааст». Вай барои ёфтани
ҷойи шикаст хеле кӯмак мекунад.
Хатоҳои маъмул
throw "матн"ба ҷойиthrow new Error("матн"). Сатрname,messageваstackнадорад. Ҳамеша объекти хаторо партоед.catch-и холӣ.catch {}ҳар мушкилотро хомӯшона фурӯ мебарад — ёфтани хатоҳо ғайриимкон мешавад.tryдар атрофи коди асинхронӣ. Хаторо дар дохили колбэкиsetTimeoutчунинtryдошта наметавонад.- Нохунакҳои якказа дар JSON.
JSON.parse("{'a': 1}")→SyntaxError. Дар JSON танҳо дукарата. - Фаромӯш карданд, ки
stringifyсатр бармегардонад.JSON.stringify(obj).name—undefined.
Ёддошт
| Чӣ | Чӣ тавр |
|---|---|
| Доштани хато | try { … } catch (e) { … } |
| Ҳамеша иҷро кардан | finally { … } |
| Партофтан | throw new Error("матн") |
| Навъи мушаххас | new TypeError(…), new RangeError(…) |
| Санҷиши навъ | e instanceof RangeError |
| Матн ва навъ | e.message, e.name |
| Ба пеш партофтан | throw e; |
| Ба сатри JSON | JSON.stringify(obj) |
| Аз сатри JSON | JSON.parse(text) |