مدیریت خطا در جاوا اسکریپت

با استفاده از مدیریت خطا یا Error Handling در برنامه نویسی میتوانیم جلوی خطاها و اشتباهات ناخواسته را گرفته و عملکرد برنامه خود را از نظر کد و پاسخگویی افزایش دهیم.

یک واقعیت در مورد خطاها در برنامه نویسی وجود دارد و آن این است که هر چقدر هم یک برنامه نویس ماهر باشیم، باز هم احتمال وقوع خطا و اشتباه در برنامه ما وجود خواهد داشت.

به وجود آمدن یک خطا دلایلی مختلفی میتواند داشته باشد؛ نظیر اشتباهات برنامه نویسی، ورودی نامعتبر از سمت کاربر، خطای سمت سرور و …

به دلیل مفسری بودن زبان جاوا اسکریپت، زمانی که در اجرای یک برنامه به خطایی برخورد میکنیم، اجرای بقیه برنامه متوقف شده و پیغام خطایی در کنسول مربوط چاپ میشود.

اما با استفاده از ساختاری که در این مقاله به بررسی آن می پردازیم، خواهید توانست توقف برنامه را در هنگام برخورد با یک خطا مدیریت و کنترل و بعضاً دستورات دلخواه خود را اجرا کنید.

 

استفاده از try catch برای مدیریت خطا در javascript

ساختاری در اکثر زبان های برنامه نویسی و البته زبان برنامه نویسی جاوا اسکریپت وجود دارد که به کمک آن میتوان وقوع یک خطا را مدیریت کرد.

این ساختار به ساختار try-catch معروف است. این ساختار که به آن try…catch…finally نیز گفته میشود، در مدیریت خطا جاوا اسکریپت بسیار کاربردی می باشد.

این ساختار دو بخش اصلی دارد:

  • بلوک try : این بخش روال اصلی برنامه ما را نشان میدهد. قسمتی از کد که احتمال میدهیم باعث ایجاد خطایی شود را در این بلوک قرار خواهیم داد.
  • بلوک catch : اگر دستورات و روال هایی که در بلوک try قرار دارند با خطا مواجه شوند، پس از ایجاد خطا، بلوک catch اجرا خواهد شد.

یک بخش دیگر را نیز میتوان در انتهای ساختار try...catch در نظر گرفت:

  • بلوک finally : این بلوک در هر صورت و در انتهای اجرای کامل یکی از دو بلوک بالا اجرا خواهد شد.

 

ساختار try-catch مدیریت خطا

از نظر نحوی syntax این ساختار به صورت زیر نوشته میشود.

try {
    // Code to run
} catch (e) {
    // Code to run if an exception occurs
} finally {
    // Code that is always executed
}

 

چگونگی اجرای بلوک try-catch

جهت درک بهتر نحوه اجرا، فرض کنید قطعه کد ساده زیر را در اختیار داریم.

try {
    alert(1);
    // Some Codes
    alert(2);
} catch {
    alert(3);
} finally {
    alert(4);
}

 

در ابتدای بلوک try سعی میشود پیامی با محتوای 1 به ما نشان داده شده و سپس یک خط کد (تابع یا هر چیز دیگری) اجرا میشود. در انتها نیز عدد 2 به صورت alert نمایش داده خواهد شد.

در صورتی که در اجرای این سه خط کد مشکلی به وجود بیاید، در بلوک catch عدد 3 و در انتهای برنامه به واسطه بلوک finally عدد 4 نمایش داده میشود.

دو سناریوی اجرا میتوان برای این قطعه کد در نظر گرفت.

  • اجرای صحیح: در این حالت تمام دستورات بلوک try و پس از آن finally اجرا خواهد شد. یعنی ترتیب نمایش اعداد به صورت 1 و 2 و 4 خواهد بود.
  • اجرا با خطا: در این حالت دستورات موجود در بلوک try تا قبل از به وجود آمدن خطا، سپس دستورات بلوک catch و در نهایت بلوک finally اجرا خواهند شد. یعنی ترتیب نمایش 1 و 3 و 4 میشود.

 

کار با شئ خطا یا error در جاوا اسکریپت

هنگامی که در اجرای یک برنامه جاوا اسکریپت به خطایی برخورد میکنیم، موتور زبان js یک شئ که حاوی اطلاعاتی در مورد خطای اتفاق افتاده می باشد را ایجاد میکند. این شئ به عنوان ورودی به بلوک catch فرستاده خواهد شد.

تمام اشیاء ساخته شده در اثر خطا دو ویژگی (property) اصلی زیر را دارا هستند:

  • نام (name) : مشخص کننده یک نام برای خطای به وجود آمده است.
  • پیام (message) : دارای پیامی مرتبط با خطای به وجود آمده است.

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

  • پشته (stack) : سلسله مراتب صدا زده شدن توابع مختلف تا وقوع خطا را به ما خروجی میدهد.

 

در قطعه کد زیر از تابعی که تعریف نشده استفاده میکنیم تا باعث ایجاد یک خطا شویم. سپس اطلاعات مربوط به خطا را بررسی میکنیم.

try {
    unDefinedVariable;
} catch (e) {
    alert(e.name);    // ReferenceError
    alert(e.message); // unDefinedVariable is not defined
}

 

با ایجاد خطا، ابتدا پیام ReferenceError و سپس پیام unDefinedVariable is not defined را مشاهده خواهیم کرد.

 

دستور throw برای ساخت خطای دلخواه

گاهی اوقات نیاز داریم خطاها (Error) یا استثنا (Exception) های دلخواه خود را در خلال برنامه و با توجه به شرایط ایجاد کنیم.

با استفاده از دستور throw میتوان یک خطا را به وجود آورد یا به اصطلاح برنامه نویسی پرتاب کرد!

ساختار throw برای مدیریت خطا

ساختار کلی استفاده از دستور throw به صورت زیر است.

throw <Error-Object>

 

ایجاد خطای جدید با throw

همانطور که میبینید، در جلوی throw می بایست یک شئ قرار داده شود. این شئ میتواند شئی دلخواه که خودمان آنرا ایجاد کرده ایم بوده یا از اشیاء آماده جاوا اسکریپت استفاده کنیم.

اشیاء مختلفی برای مدیریت خطا جاوا اسکریپت وجود دارند که مرتبط با خطاها هستند. اشیائی نظیر Error یا Exception یا SyntaxError.

 

کار با شئ Error

شئ Error را میتوان به سادگی و با استفاده از مفهوم ایجاد شئ در برنامه نویسی ایجاد کرد. از این کلاس میتوان استفاده های زیادی در مدیریت خطا جاوا اسکریپت کرد.

در حالت ساده، به عنوان تنها ورودی سازنده (Constructor) آن میتوان یک متن پیام (یا همان خصوصیت message) را به شئ داد.

به قطعه کد زیر دقت کنید.

try {
    var n = prompt("Please Enter the Number")
    if( n > 50 ){
        throw new Error("The Number is too big!");
    }
} catch (e) {
    alert(e.message);
}

 

این برنامه یک عدد را به عنوان ورودی از ما گرفته و در صورتی که عدد از 50 بزرگتر باشد یک خطا با پیامی مرتبط پرتاب میکند.

در ادامه و در بلوک catch آن پیام را دریافت کرده و به صورت پیام به کاربر نمایش میدهیم.

 

به همین راحتی میتوانیم خطاهای مختلفی ایجاد کرده و در بلوک catch با توجه به نوع پیام، کارهای مناسبی را انجام دهیم.