فصل هفدهم: مدیریت خطا در اکما اسکریپت

18 شهریور 1397
es6-errors

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

خطاهای نحوی

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

خطاهای زمان اجرا

خطاهای زمان اجرا یا استثناها (Exception) در هنگام اجرا (بعد از کامپایل/تفسیر) اتفاق می افتد. استثناها در نخی (thread) که کد روی آن در حال اجراست تاثیر می گذارد و اجازه می دهد که نخ های دیگر جاوا اسکرپیت اجرای نرمال خودشان را ادامه بدهند.

خطاهای منطقی

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

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

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

# آبجکت Error توضیحات
1 EvalError یک نمونه برای نمایش خطایی که در خصوص تابع سراسری evel() اتفاق می افتد، را ایجاد می کند
2 RangeError یک نمونه برای نمایش خطا در هنگامی که متغیر عددی یا پارامتر خارج از محدوده مجاز تعریف شده برای آن قرار نداشته باشد، را ایجاد می کند.
3 ReferenceError یک نمونه در هنگامی که برنامه به یک جای غیرمجاز اشاره میکند، ایجاد می کند
4
SyntaxError
یک نمونه برای نمایش خطای نحوی که هنگام تجزیه کد برنامه اتفاق می افتد، را ایجاد میکند.
5
TypeError
یک نمونه برای نمایش یک خطا هنگامی که یک متغیر یا پارامتر یک نوع غیرمجاز داشته باشد، ایجاد میکند.
6 URIError یک نمونه برای نمایش یک خطا هنگامی که متدهای encodeURI() یا decodeURI() پارامتر های غیرمجاز دریافت میکند، ایجاد می کند.

ایجاد یک استثناء

شما می توانید با دستور throw یک خطا ایجاد کنید. در ادامه می توانید این خطای ایجاد شده را گرفته و یک عملیات خاصی را بر روی آنها انجام دهید.

سینتکس- ایجاد یک خطا در حالت کلی

throw new Error([message]) 
OR 
throw([message])

سینتکس- ایجاد یک خطای خاص

throw new Error_name([message])

مدیریت خطا

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

دقت داشته باشید که بعد از دستور try حتماً از متد catch استفاده کنید. همچنین می توانید در صورت تمایل از دستور finally هم استفاده کنید.

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

سینتکس آن مطابق زیر است:

try {  
   // Code to run  
   [break;]  
} catch ( e ) {  
   // Code to run if an exception occurs
   [break;]  
}[ finally {  
   // Code that is always executed regardless of  
   // an exception occurring  
}]

مثال 

var a = 100; 
var b = 0; 
try { 
   if (b == 0 ) { 
      throw(“Divide by zero error.”); 
   } else { 
      var c = a / b; 
   } 
} 
catch( e ) { 
   console.log("Error: " + e ); 
}

خروجی 

Error: Divide by zero error

نکته: می توانید یک استثناء را در یک تابع ایجاد و سپس از این تابع در یک دستور try…catch استفاده کنید.

متد onerror()

اداره کننده رویداد onerror اولین ویژگی جاوا اسکریپت برای مدیریت خطا یا استثناء بود. هر گاه یک خطا در صفحه اتفاق بیفتد این رویداد در آبجکت window اجرا می شود.

مثال 

<html> 
   <head> 
      <script type = "text/javascript"> 
         window.onerror  =  function () {  
            document.write ("An error occurred.");  
         } 
      </script> 
   </head> 

   <body> 
      <p>Click the following to see the result:</p> 
      <form> 
         <input type = "button" value = "Click Me" onclick = "myFunc();" /> 
      </form> 
   </body> 
</html>

اداره کننده رویداد onerror، سه بخش از اطلاعات برای مشخص کردن ماهیت دقیق خطا را ارائه می کند:

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

در مثال زیر نحوه استخراج این اطلاعات را نشان می دهیم:

مثال

<html> 
   <head> 
      <script type = "text/javascript"> 
         window.onerror  =  function (msg, url, line) {  
            document.write ("Message : " + msg );  
            document.write ("url : " + url );  
            document.write ("Line number : " + line );  
         } 
      </script> 
   </head> 

   <body> 
      <p>Click the following to see the result:</p> 
      <form> 
         <input type = "button" value = "Click Me" onclick = "myFunc();" /> 
      </form> 
   </body> 
</html>

خطاهای سفارشی

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

مثال 1- خطاهای سفارشی با متن پیش فرض

function MyError(message) { 
   this.name = 'CustomError'; 
   this.message = message || 'Error raised with default message'; 
} 
try { 
   throw new MyError(); 
} catch (e) {  
   console.log(e.name);      
   console.log(e.message);  // 'Default Message' 
}

خروجی

CustomError 
Error raised with default message

مثال 2- خطاهای سفارشی با متن تعریف شده توسط کاربر

function MyError(message) { 
   this.name = 'CustomError'; 
   this.message = message || 'Default Error Message';  
} try { 
   throw new MyError('Printing Custom Error message'); 
} 
catch (e) { 
   console.log(e.name);      
   console.log(e.message);  
}

خروجی

CustomError 
Printing Custom Error message
نویسنده شوید

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

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