Гузариш ба мундариҷа
Мавзӯи 16 аз 16
Назария

Хатоҳо ва 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 дорад — рӯйхати функсияҳое, ки хато аз онҳо «гузаштааст». Вай барои ёфтани ҷойи шикаст хеле кӯмак мекунад.

Хатоҳои маъмул

  1. throw "матн" ба ҷойи throw new Error("матн"). Сатр name, message ва stack надорад. Ҳамеша объекти хаторо партоед.
  2. catch-и холӣ. catch {} ҳар мушкилотро хомӯшона фурӯ мебарад — ёфтани хатоҳо ғайриимкон мешавад.
  3. try дар атрофи коди асинхронӣ. Хаторо дар дохили колбэки setTimeout чунин try дошта наметавонад.
  4. Нохунакҳои якказа дар JSON. JSON.parse("{'a': 1}") → SyntaxError. Дар JSON танҳо дукарата.
  5. Фаромӯш карданд, ки 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)

Таҳлили бехатар

Осон+10 XP

Функсияи safeParse(text)-ро нависед: агар text JSON-и дуруст бошад, қимати таҳлилшударо баргардонед, ва агар не — null баргардонед (барнома набояд афтад).

safeParse('{"a": 1}')   → { a: 1 }
safeParse("[1, 2]")     → [1, 2]
safeParse("{oops}")     → null

Барои ҳал кардани масъалаҳо коннекторро пайваст кун

Коди масъалаҳо дар компютери худат иҷро мешавад — ин аз браузер тезтар ва боэътимодтар аст. Барои ин барномаи ройгони коннектори CodeWithMe лозим аст. Онро як бор пайваст кардан кифоя аст.

Коннекторро дар ин компютер ҷустуҷӯ мекунем…

  1. 1
    Коннекторро барои системаи худ (Windows, macOS ё Linux) зеркашӣ кун.Зеркашии коннекторДар саҳифаи зеркашӣ файлеро интихоб кун, ки дар номаш системаи ту ҳаст, масалан windows-amd64.
  2. 2Онро иҷро кун ва ҷузвдонеро интихоб кун, ки ҳалҳоят дар он ҷо меистанд. Python ва Node.js-ро ӯ худаш ҳангоми зарурат ба он ҷо мегузорад.
  3. 3
    Дар поён рамзи 6-рақамаро ворид кун — он дар равзанаи коннектор навишта шудааст («Рамз барои сайти CodeWithMe»). Агар браузер дар бораи дастрасӣ ба шабакаи маҳаллӣ пурсад — иҷозат деҳ.

Коннектор кушода аст (рамзи манбаъ дар GitHub), танҳо дар компютери ту кор мекунад ва кодро танҳо пас аз ворид кардани рамзи пайвастшавӣ иҷро мекунад.