30 روز با Node - روز پنجم: خطاها

21 مرداد 1397
errors-nodejs

خطاها چیستند؟

هرموضوعی که غیرمنتظره اتفاق بیفتد و باعث شود که برنامه‌ی ما به درستی کار نکند یا باعث توقف اجرای آن شود، یک خطا یا error به شمار می‌آید.

خطاها در نود جی اس

یک شی‌ءاز کلاس error در نود جی اس مشخص نمی کند تحت چه شرایطی خطا رخ داده است ولی می‌تواند جایی که خطا بوجود آمده، از ردپاهایی در کد برنامه، پشته‌ای از جزئیات بسازد تا شاید در توصیف خطا مؤثر باشد. در نود جی اس خطاهایی که تولید می‌شود یا از کلاس error نمونه سازی شده اند، یا خود نمونه ای از کلاس error  هستند.

بررسی صفات کلاس خطاها و متدهای آن در نود جی اس

۱) new Error(message) : همانند کلاس‌های دیگر، برای ایجاد یک نمونه از یک کلاس،  از دستور new استفاده می‌کنیم. رشته ای که به کلاس ارسال می گردد باعث مقدار دهی صفت error.message نیز خواهد شد.

const err = new Error('This is an error message');

۲) صفت error.message : این صفت که توصیفی از خطا است، در زمان ایجاد شیء (با دستور new error(msg)) مقدار می‌گیرد. اساسا پیام msg در اولین سطر از پشته ردیابی خطا می آید. به مثال زیر دقت کنید:

//here error.message property is set to the string provided.

const err = new Error('This is an error message');
console.error(err.message);
//Output will be :
//This is an error message

۳) صفت error.code : یک برچسب رشته ای است که برای تشخیص نوع خطا به کار می رود و به فرم node.js error codes مشخص می شود.

۴) صفت error.stack : رشته ای را بر می گرداند که در آن در مورد مکانی که خطا نمونه سازی شده است، جزئیاتی وجود دارد.

۵) متد error.captureStackTrace : این متد برای ایجاد صفت .stack در شیءای به کار می رود که متد را فراخوانی کرده است.  داده ای که برمی گرداند به فرم رشته می باشد.

۶) صفت error.stackTraceLimit : تعداد فریم های پشته را در ردیابی پشته مشخص می کند. پیش فرض آن 10 است ولی می تواند هر مقدار عددی معتبر به خود بگیرد ولی اگر مقداری غیرعددی یا منفی بگیرد، هیچ فریمی برنمی گرداند.

انتشار و شنود خطا در نود جی اس

در نود جی اس، چندین مکانیسم برای انتشار خطا و رسیدگی به خطاهای منتشر شده در زمان اجرای برنامه، داریم. هر چند روش گزارش و رسیدگی به این خطاها کاملا به نوع خطا و نیز به نوع سبک API بستگی دارد:

۱) APIهای همزمان: اینها همانهایی هستند که از متد بلاک بدون پذیرش توابع کال بک استفاده کرده و از throw برای گزارش خطا بهره می برند.

۲) APIهای غیر همزمان: خطاهایی که در این نوع APIها رخ می دهد، به شیوه‌های گوناگونی گزارش داده می شوند:

  •  چنانچه یک رویداد ناهمزمان روی یک شیء فراخوانی شود، خطاها به رویداد error آن شیء هدایت می شوند.

نکته: اگر از قطعه برنامه داده شده سر در نمی آورید، نگران نباشید، فقط تلاش کنید که مفهوم کلی را بگیرید.

connection.on('error', (err) => {
              //This is the error event which is used
              //to handle the error properly
              console.error(err);
});

  • متدهای غیر همزمان در نودجی اس، بعنوان اولین آرگومان یک شیء خطا را قبول می کنند و این موضوع باعث می شود که متدهای فوق، کال بک ها را قبول کنند. این خطاها به شیوه‌ی زیر رسیدگی می‌شوند.
//Reading a File Asynchronously using nodejs
//if any error occurs such as file not found
//we don't have permissions , etc
//then an err message will be console.
//otherwise data will be printed
var fs=require('fs');
 
fs.readFile('message.txt', (err, data) => {
  if (err)
         return console.error(err);
        
  console.log("Content :  " + data);
});
  • تعداد کمی از متدهای غیر همزمان، کماکان از شیوه سنتی throw برای نمایش یک خطا استفاده می کنند تا بعدا به کمک بلاک try/catch خطاها را رسیدگی کنند که البته این روش پیشنهاد نمی شود.

توابع کال بک سبک دار در نود جی اس

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

 
const fs = require('fs');
 
function nSCallback(error, data) {
  if (error) {
    console.error('Error : ', error);
    return;
  }
  console.log(data);
}
fs.readFile('file_that_exists', nSCallback);
fs.readFile('file_does_not_exists', nSCallback);                                        

try/catch چرا نه؟

در APIهای غیر همزمان از مکانیسم بلاک try/catch برای شنود و به دام انداختن خطا استفاده نمی شود.

نکته: قطعه کد زیر معتبر نیست

//Invalid Snippet
//An asynchronous operation which will generate error
try {
  async_method('invalid_arguments_generate_error', (err, data) => {
    if (err) {
      throw err;
    }
  });
} catch (err) {
        console.error(err);
}                                                   

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

بیشتر درباره خطاها بدانیم

در اپلیکیشن های نود جی اس، اکثر خطاها در یکی از دسته بندی های زیر قرار می گیرند:

1. خطاهای استاندارد جاوا اسکریپت:

خطای <URI>: وقتی که یک تابع عمومی رسیدگی به URI درست استفاده نشود
خطای <Eval>: وقتی که فراخوانی تابع eval() به مشکل بر می خورد
خطای <Type>: این خطا یک زیرکلاس از خطا است که نشان می دهد آرگومان از نوع مجاز نیست. مثلا ارسال یک شیء به جای رشته یک خطای TypeError است.
خطای <Range>: این زیرکلاس خطا نیز بیان می کند که آرگومان موردنظر خارج از محدوده مقدار مجاز است.
خطای <Syntax>: این زیرکلاس خطا نیز نشان می دهد که کد نوشته شده به زیان جاوااسکریپت، اشتباه دارد.
خطای <Reference>: این زیرکلاس از خطا نیز بیان می کند که متغیری استفاده شده که قبلا تعریف نشده است. این خطا بسیار رایج است.

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

بررسی صفات موجود در کلاس خطاهای سیستم:

error.code: رشته ای که کد خطا را درخود دارد. مثل EACCES، EADDRINUSE، ECONNREFUSED و غیره.

error.port: عددی که بیان می کند پورت ارتباطی در دسترس نیست.

error.address: رشته ای حاوی آدرس ارتباطی اشتباه.

error.path: رشته ای که دربردارنده یک مسیر نامعتبر است

error.syscal: رشته ای که حاوی فراخوانی syscall شکست خورده است.

error.errno: اگر عدد باشد، مقداری منفی خواهد بود که مرتبط با error.code  است و اگر رشته باشد، همان مقدار error.code.

3. خطاهای مشخص شده توسط کاربر: این نوع خطاها توسط کد برنامه تولید می شوند.

4. خطاهای ادعایی یا Assertion: این گونه خطاها توسط دستور assert ایجاد می شوند. نوع خاصی از errors هستند و زمانی اتفاق می افتد که قرار نبوده در نود جی اس رخ دهند.

خلاصه

در این بخش از سری 30 روز با نود جی اس، اطلاعاتی درمورد errors یاد گرفتیم که شامل خطاها در نود جی اس و صفات کلاس errors در نود جی اس بود.

همچنین درمورد انتشار خطا و شنود آنها در نود جی اس مطالبی فراگرفتیم، فهمیدیم مفهوم توابع کال بک سبک دار چیست و چرا بهتر است از بلاک try/catch استفاده نکنیم. در نهایت نیز خطاها را در 4 دسته بندی تقسیم کردیم: خطاهای استاندارد جاوا اسکریپت، خطاهای سیستم، خطاهای مشخص شده توسط کاربر و خطاهای ادعایی.

نویسنده شوید

دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.