شیء Error و خانواده‌ی انواع خطای داخلی جاوااسکریپت

در طول این دوره بارها با throw new Error(...) و error.message کار کرده‌اید، اما تا این‌جا خود شیء Error و رده‌ی کامل خطاهای داخلی جاوااسکریپت به‌طور مستقل بررسی نشده است. شناخت دقیق این ساختار، به‌ویژه تفاوت میان انواع مختلف خطا، پیش‌نیاز مستقیم مبحث ساخت خطاهای سفارشی است که در درس بعدی بررسی می‌شود.

ساختار پایه‌ی شیء Error

هر شیء ساخته‌شده با سازنده‌ی Error، حداقل دو ویژگی اصلی دارد: message که متن توضیح خطا را نگه می‌دارد، و stack که مسیر دقیق فراخوانی توابع تا نقطه‌ی وقوع خطا را ثبت می‌کند:

const err = new Error("چیزی اشتباه پیش رفت");

console.log(err.message); // "چیزی اشتباه پیش رفت"
console.log(err.name);    // "Error"
console.log(err.stack);   // رشته‌ای شامل نام خطا و مسیر فراخوانی توابع

ویژگی stack در حالت عادی برای کاربر نهایی نمایش داده نمی‌شود، اما در فرآیند دیباگ کردن و لاگ‌گیری سمت توسعه‌دهنده، اطلاعات بسیار ارزشمندی درباره‌ی محل دقیق وقوع خطا در اختیار قرار می‌دهد.

زیرکلاس‌های داخلی Error

جاوااسکریپت علاوه بر Error عمومی، چند نوع تخصصی‌تر نیز به‌صورت داخلی تعریف کرده که هرکدام برای دسته‌ی مشخصی از خطاها استفاده می‌شوند. تمام این انواع، از Error ارث‌بری می‌کنند:

نوع خطا معمولاً چه زمانی رخ می‌دهد
TypeError وقتی عملیاتی روی مقداری از نوع نامناسب انجام شود؛ مثل فراخوانی متدی که وجود ندارد
RangeError وقتی مقداری خارج از بازه‌ی مجاز باشد؛ مثل طول نامعتبر آرایه
SyntaxError وقتی کد یا رشته‌ی داده‌شده از نظر نحوی نامعتبر باشد؛ مثل JSON.parse روی رشته‌ی خراب
ReferenceError وقتی به متغیری که تعریف نشده ارجاع داده شود

مشاهده‌ی عملی چند نوع خطا

هر یک از این خطاها در موقعیت‌های مشخصی به‌طور خودکار توسط موتور جاوااسکریپت پرتاب می‌شوند:

مشاهده‌ی انواع مختلف خطا
خروجی کنسول اینجا نمایش داده می‌شود...

استفاده از instanceof برای تشخیص نوع خطا

از آنجا که تمام این انواع از Error ارث‌بری می‌کنند، عملگر instanceof امکان تشخیص دقیق نوع خطا را در بلوک catch فراهم می‌کند، دقیقاً همان تکنیکی که در درس مدیریت خطای async/await هم دیده شد:

function processValue(value) {
  try {
    return JSON.parse(value);
  } catch (error) {
    if (error instanceof SyntaxError) {
      console.log("مقدار ورودی JSON معتبری نیست");
    } else if (error instanceof TypeError) {
      console.log("نوع ورودی قابل پردازش نیست");
    } else {
      throw error; // خطای ناشناخته به لایه‌ی بالاتر منتقل می‌شود
    }
  }
}

نکته‌ی مهم در این الگو، بخش else { throw error; } است: اگر نوع خطا با هیچ‌کدام از شرط‌های بررسی‌شده مطابقت نداشت، به‌جای بلعیدن خاموش آن، دوباره throw می‌شود تا لایه‌ی بالاتر برنامه فرصت مدیریت آن را داشته باشد.

نکات کلیدی

  • هر شیء Error حداقل دو ویژگی اصلی دارد: message برای متن خطا و stack برای مسیر فراخوانی توابع.
  • TypeError، RangeError، SyntaxError و ReferenceError، زیرکلاس‌های تخصصی Error هستند که هرکدام برای دسته‌ی مشخصی از خطاها استفاده می‌شوند.
  • عملگر instanceof امکان تشخیص دقیق نوع خطا در بلوک catch را فراهم می‌کند.
  • خطایی که با هیچ شرط شناخته‌شده‌ای مطابقت ندارد، بهتر است دوباره throw شود تا به‌طور خاموش نادیده گرفته نشود.

جمع‌بندی

شیء Error و زیرکلاس‌های داخلی آن مثل TypeError و RangeError، ساختاری استاندارد برای توصیف انواع مختلف خطا در جاوااسکریپت فراهم می‌کنند. تشخیص دقیق نوع خطا با instanceof، امکان واکنش متفاوت و هدفمند به هر دسته از خطاها را می‌دهد، به‌جای برخورد یکسان با تمام خطاها. در درس بعدی، نحوه‌ی ساخت انواع خطای سفارشی با ارث‌بری از Error بررسی خواهد شد.