# JavaScript xatolarni ushlash (try, catch)

> JavaScript'da xatolar: try/catch/finally bloklari, xato turlari, throw bilan o'z xatoingizni yaratish va dasturni buzilishdan saqlash usullari.

Manba: https://learncode.uz/javascript/xatolar/
Sana: 2026-05-30

Xato dasturni to'xtatadi: keyingi kod bajarilmaydi. Ammo ba'zi xatolarni
oldindan aytib bo'lmaydi — fayl yo'q, tarmoq uzilgan, foydalanuvchi noto'g'ri
ma'lumot kiritgan. Ularni **ushlab olish** kerak.

## Xato dasturni to'xtatadi

```js
console.log("Boshlandi");

const num = null;
console.log(num.toFixed(2));

console.log("Bu qator bajarilmaydi");
```

Oxirgi qator chiqmadi — xato butun kodni to'xtatdi.

## try va catch

```js
console.log("Boshlandi");

try {
  const num = null;
  console.log(num.toFixed(2));
} catch (error) {
  console.log("Xato ushlandi:", error.message);
}

console.log("Dastur davom etdi");
```

`try` ichidagi kod xato bersa, boshqaruv `catch` ga o'tadi va dastur
**to'xtamaydi**.

## Xato obyekti

```js
try {
  yoqFunksiya();
} catch (e) {
  console.log("Nomi:", e.name);
  console.log("Xabar:", e.message);
}
```

## Ko'p uchraydigan xato turlari

| Tur | Qachon chiqadi |
|---|---|
| `ReferenceError` | mavjud bo'lmagan o'zgaruvchiga murojaat |
| `TypeError` | qiymat kutilgan turda emas (`null.xossa`) |
| `SyntaxError` | sintaksis xatosi — kod umuman ishlamaydi |
| `RangeError` | qiymat ruxsat etilgan oraliqdan tashqarida |

```js
try {
  JSON.parse("{buzuq}");
} catch (e) {
  console.log(e.name);
  console.log(e.message);
}
```

## finally

Xato bo'ldimi yoki yo'q — bu blok **doim** bajariladi:

```js
function check(value) {
  try {
    console.log("Natija:", value.toUpperCase());
  } catch (e) {
    console.log("Xato:", e.message);
  } finally {
    console.log("--- tugadi ---");
  }
}

check("salom");
check(null);
```

`finally` resurslarni tozalash uchun ishlatiladi: faylni yopish, yuklanish
belgisini o'chirish.

## throw — o'z xatongizni yaratish

```js
function checkAge(age) {
  if (typeof age !== "number") {
    throw new Error("Yosh num bo'lishi kerak");
  }
  if (age < 0) {
    throw new Error("Yosh manfiy bo'lolmaydi");
  }
  return "Yosh qabul qilindi: " + age;
}

try {
  console.log(checkAge(25));
  console.log(checkAge(-5));
} catch (e) {
  console.log("Ushlandi:", e.message);
}
```

> **Nega throw kerak**
>
> Funksiya noto'g'ri ma'lumot olganda `console.log` bilan ogohlantirish
> yetarli emas — chaqiruvchi kod buni bilmaydi va xato bilan davom etadi.
> `throw` esa bajarilishni to'xtatadi va muammoni chaqiruvchiga uzatadi.

## Amaliy misol: ishonchli o'girish

[Sonlar](https://learncode.uz/javascript/sonlar-math) darsidagi `Number()` noto'g'ri matnda
`NaN` qaytaradi — buni xatoga aylantirsak, muammo darhol ko'rinadi:

```js
function toNumber(text) {
  const n = Number(text);
  if (Number.isNaN(n)) {
    throw new Error(`"${text}" ni songa o'girib bo'lmadi`);
  }
  return n;
}

const input = ["42", "19.99", "salom"];

for (const q of input) {
  try {
    console.log(q, "->", toNumber(q));
  } catch (e) {
    console.log(e.message);
  }
}
```

Sikl ichida `try/catch` bo'lgani uchun bitta xato butun siklni to'xtatmadi.

## Hamma narsani o'rab qo'ymang

<Callout type="warning" title="Bo'sh catch — yomon odat">
```js
try {
  muhimAmal();
} catch (e) {
  // hech narsa
}
```

Bunday kod xatoni **yashiradi**: dastur ishlayotgandek ko'rinadi, lekin
natija noto'g'ri bo'ladi va sababini topish juda qiyin. Kamida
`console.error(e)` yozing.
</Callout>

`try/catch` faqat **kutilishi mumkin** bo'lgan xatolar uchun: tarmoq so'rovi,
JSON o'qish, foydalanuvchi kiritmasi. Dasturchi xatosini (noto'g'ri yozilgan
o'zgaruvchi nomi) u yashirmasligi kerak — u tuzatilishi kerak.

## Amaliy mashq

Xatolarni boshqaring:

1. `null` qiymatga metod chaqirib, xatoni `try/catch` bilan ushlang;
2. `e.name` va `e.message` ni chiqaring;
3. `JSON.parse("{buzuq}")` ni sinab ko'ring;
4. `throw new Error()` bilan o'z xatongizni yarating;
5. `finally` qo'shib, u qachon ishlashini tekshiring;
6. massiv ustidan yurib, xatoli elementlarni o'tkazib yuboring.

5-qadamda `try` ichiga `return` qo'ying — `finally` baribir ishladimi?

## Qisqacha xulosa

- Ushlanmagan xato dasturni **to'xtatadi**.
- `try` — xavfli kod, `catch` — xato ushlanadi, `finally` — doim bajariladi.
- Xato obyektida `name` va `message` xossalari bor.
- `throw new Error("...")` — o'z xatongizni yaratish.
- Bo'sh `catch` xatoni yashiradi — kamida jurnalga yozing.

Keyingi darsda [zamonaviy ES6 sintaksis](https://learncode.uz/javascript/es6-sintaksis) —
destructuring, spread va shablonlarni ko'ramiz.
