۱۳

مدیریت خطا (Error Handling) 🛡️

کدهامون رو ضدضربه می‌کنیم تا با هر اشتباهی از کار نیفتن.

`try...catch`: تور نجات کدها!

هیچکس کامل نیست، کد ما هم همینطور! گاهی وقتا ممکنه یه خطایی پیش بیاد که کل برنامه رو از کار بندازه. بلوک `try...catch` مثل یه تور نجات عمل می‌کنه. ما کدهای "خطرناک" رو داخل بلوک `try` می‌ذاریم. اگه خطایی اتفاق بیفته، برنامه کرش نمی‌کنه، بلکه می‌پره تو بلوک `catch` و ما اونجا می‌تونیم خطا رو مدیریت کنیم.

try {
  // کدی که ممکنه خطا بده رو اینجا می‌نویسیم
  console.log("شروع بلوک try...");
  let user = { name: "علی" };
  console.log(user.profile.age); // اینجا خطا می‌ده چون profile وجود نداره
  console.log("این خط هرگز اجرا نمی‌شه.");
} catch (error) {
  // اگه خطایی تو بلوک try اتفاق افتاد، اینجا مدیریتش می‌کنیم
  console.error("آخ! یه خطایی پیش اومد!");
  console.error("نوع خطا:", error.name);
  console.error("پیام خطا:", error.message);
} finally {
  // این بلوک همیشه اجرا می‌شه، چه خطا بده چه نده
  console.log("بلوک finally همیشه اجرا می‌شه.");
}

`throw`: خطای شخصی بساز!

گاهی وقتا خودمون می‌خوایم یه خطا ایجاد کنیم. مثلاً اگه کاربر یه ورودی اشتباه وارد کرد. با کلمه کلیدی `throw` می‌تونیم یه خطای سفارشی "پرتاب" کنیم که توسط بلوک `catch` گرفته بشه.

function divide(a, b) {
  if (b === 0) {
    // پرتاب کردن یه خطای جدید
    throw new Error("تقسیم بر صفر مجاز نیست رفیق!");
  }
  return a / b;
}

try {
  let result = divide(10, 0);
  console.log(result);
} catch (error) {
  console.error(error.message); // خروجی: "تقسیم بر صفر مجاز نیست رفیق!"
}

تمرین! 🧠

یه تابع بنویس به اسم `parseJson` که یه رشته متنی می‌گیره. داخل تابع، با `try...catch` تلاش کن که اون رشته رو به JSON تبدیل کنی (`JSON.parse`). اگه رشته معتبر بود، آبجکت JSON رو برگردون. اگه معتبر نبود و خطا داد، به جای کرش کردن، پیام "رشته ورودی معتبر نیست!" رو برگردون.

جواب تمرین

function parseJson(jsonString) {
  try {
    const result = JSON.parse(jsonString);
    return result;
  } catch (error) {
    return "رشته ورودی معتبر نیست!";
  }
}

const validJson = '{"name": "کتاب", "price": 50}';
const invalidJson = '{"name": "کتاب", price: 50}'; // اشتباه: کلید price کوتیشن نداره

console.log(parseJson(validJson));   // خروجی: {name: 'کتاب', price: 50}
console.log(parseJson(invalidJson)); // خروجی: "رشته ورودی معتبر نیست!"