تعداد بازدید: 351

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

مبحث مدیریت خطا (Error Handling) یک موضوع مهم در تولید نرم افزار فارغ از بستر پیاده سازی (سیستم عامل) و ابزار (زبان برنامه نویسی) آن می باشد. همان طور که باید به خوبی از وقوع خطا جلوگیری کرد باید وقوع خطا را نیز مدیریت کرد.

در رابطه با اهمیت مدیریت خطا در روند توسعه نرم افزار این جمله را به خاطر بسپارید:

اگر احتمال خطای موضوعی وجود دارد، خطا رخ خواهد داد.

پردازش ها معمولا در حالت های مختلف قرار می گیرند . ممکن است یک پردازش اصلا کار نکند ! ممکن است به ازای حالت های مختلف کار نکند. مدیریت خطا مربوط به نوع دوم است . در فرضیات آماری به این نوع خطا ها خطای نوع اول و خطای نوع دوم می گوییم.خطای نوع اول به تصمیم درست منتهی می شود و خطای نوع دوم پس از تصمیم درست وقوع پیدا می کند!.

نکته مهم در مدیریت خطا این است که باید حتما قبل از مدیریت خطا از وقوع آن جلوگیری کنیم. علاوه بر اجرای صحیح کد (Clean Code) که به صورت خودکار از وقوع برخی خطا ها جلوگیری می کند باید حالت های مختلف را نیز برای پردازش خود در نظر بگیریم همان طور که در زمان نوشتن تست برای متد ها این عملیات ها را در نظر داشتیم .

Native Errors in JavaScript

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

نمایش خطا توسط مفسر معمولا در console مرورگر یا در terminal Interface بستری (سیستم عاملی) که مفسر Nodejs را روی آن نصب کرده ایم ، نمایش داده می شود.

ReferenceError

این خطا زمانی رخ می دهد که متغیر یا موجودیتی که آن را فراخوانی کرده ایم در حافظه موجود نمی باشد . عبارت کلیدی که در این زمان رخ می دهد variable/item doesn’t exist.

console.log(dog)
Uncaught ReferenceError: dog is not defined
    <anonymous> debugger eval code:1

SyntaxError

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

va name='abolfazl'
Uncaught SyntaxError: unexpected token: identifier

TypeError

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

var num = 100;
num.toUpperCase();
Uncaught TypeError: num.toUpperCase is not a function

InternalError

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

function foo() {
 foo()
}
foo()

RangeError

زمانی که مقدار ورودی در بازه مورد نظر نباشد این خطا بوجود می آید . فرض کنید قرار است عدد ساعت را وارد کند. عدد ساعت باید کمتر از ۲۳ باشد . اگر این عدد با این مقدار به صورت اشتباه وارد شد می توان این خطا را اجرا کرد:

function setHour(h){
    if(h>23){
        throw new RangeError('invalid value for Hour')
    }
    //More progress
    return true
}
setHour(25)
/*Uncaught RangeError: invalid value for Hour*/

try…catch

مدیریت خطا با بلوک try…catch یکی از رایج ترین روش های مدیریت خطا است که در زبان مبتنی بر زبان C وجود دارد . این قابلیت این امکان را فراهم می سازد تا حالت صحیح و حالت خطا را در دو بلوک مجزا داشته باشیم تا با مدیریت خطا بتوانیم این موضوع را کنترل کنیم.

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

try{
 #try process 
} catch(error) {
 #error was accoured and having error OBJECT 
} finally{
 #finally event.
}

بلوک finally چه به ازای اجرای کد و چه به ازای عدم اجرای آن (وقوع خطا) اجرا می گردد.

روند اجرای کد پایین را به ازای فراخوانی تابع که تعریف نشده است Reference Error می توان یافت به این صورت که بلوک catch و بلوک finally اجرا شده اند و شئ error را در بلوک دوم داریم تا با آن خطا را مدیریت کنیم.

try{
    myfunc()
}catch(error){
    console.log(error)
}finally{
    console.log('process complate')
}
//ReferenceError: myfunc is not defined
//<anonymous> debugger eval code:2
//debugger eval code:4:10
//process complate

معمولا زمانی که در سمت کلاینت نرم افزار را توسعه می دهیم قرار است که بسته به پاسخ سرور درخواست را مدیریت کنیم . به این شکل که درخواست را در بلوک try…catch ارسال می کنیم و پس از آن می توانیم پاسخ را در صورت وقوع خطا یا صحت مدیریت کنیم.

var req = new Request;
try {
   let result = req.post()
}catch(error){
   console.log(error)
}

Error Object Properties

این شئ در بلوک catch در اختیار برنامه قرار می گیرد تا بتوان اطلاعات خطای اجرا شده را در دست داشت. لیست ویژگی های این شئ را در زیر بررسی می کنیم:

name نوع خطا که یکی از موارد Reference Error , Type Error , Range Error , … است
message متن خطا

مدیریت خطا منحصرا به تجربه بهتر کاربر و کمک به عیب یابی بهتر برنامه نویس باشد.مثلا در سیستم عامل ها می توان دید که زمانی که به خطا برمی خوریم یک پیغام به کاربر نمایش داده می شود و یک سری لاگ از خطای اجرا شده به سمت سرور اصلی در صورت اتصال به اینترنت ارسال می کند.

عملا مدیریت نهایی خطا در سمت کلاینت اتفاق می افتد و در سمت سرور معمولا خطا ارسال – throw – و در سمت کلاینت خطا را دریافت – catch – و مدیریت صحیح می کنیم.مثل توبی که از یک سمت پرتاب می گردد و در سمت دیگر گرفته می شود.

مطالب مشابه

JavaScript Statements

در جاوا اسکریپت دستورالعمل های قابل اجرا را statement می گوییم که توسط مفسر جاوا اسکریپت (JavaScript interpreter) که می...

Array in JavaScript

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

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای مدیریت خطا در جاوا اسکریپت

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *