سه نوع خطا در برنامه نویسی وجود دارد: (a) خطاهای syntax ، (b) خطاهای runtime و (c) خطاهای منطقی (logical) .

خطاهای سینتکس

خطاهای syntax (قاعده نوشتاری) ، به عنوان خطاهای parsing (تجزیه) نیز شناخته می شوند ، که در زمان کامپایل (compile) در زبان های برنامه نویسی سنتی و در زمان تفسیر (interpret) در جاوا اسکریپت رخ می دهند.

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

<script type = "text/javascript">
   <!--
      window.print(;
   //-->
</script>

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

خطاهای Runtime (زمان اجرا)

خطاهای Runtime ، که استثناها نیز نامیده می شوند ، در حین اجرا (پس از کامپایل / تفسیر) رخ می دهند.

به عنوان مثال ، خط زیر موجب بروز یک خطای runtime می شود ، زیرا ، در اینجا syntax (قاعده نوشتاری) درست است ، اما در زمان اجرا ، در حال تلاش برای فراخوانی یک متدی است که وجود ندارد.

<script type = "text/javascript">
   <!--
      window.printme();
   //-->
</script>

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

خطاهای منطقی

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

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

دستور try…catch…finally

آخرین ورژن جاوا اسکریپت امکانات رسیدگی به استثنا را اضافه کرده است. جاوا اسکریپت سازنده try…catch…finally همچنین عملگر پرتاب را برای اداره استثناها اجرا می کند.

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

در اینجا ترکیب نوشتاری بلوک try…catch…finally قرار دارد:

<script type = "text/javascript">
   <!--
      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
      }]
   //-->
</script>

بلوک try باید دقیقا توسط یک بلوک catch یا یک بلوک finally (یا یکی از هر دو) دنبال شود. وقتی که یک استثناء در بلوک try رخ می دهد ، استثنا در قسمت e قرار می گیرد و بلوک catch اجرا می شود. بلوک اختیاری finally پس از try/catch بدون شرط اجرا می شود.

مثال:

در ادامه مثالی عنوان شده که در آن شما سعی در فراخوانی تابعی ناموجود دارید و باعث بروز یک استثنا می شود. میبینید که بدون try…catch چطور عمل می کند:

<html>
   <head>      
      <script type = "text/javascript">
         <!--
            function myFunc() {
               var a = 100;
               alert("Value of variable a is : " + a );
            }
         //-->
      </script>      
   </head>
   
   <body>
      <p>Click the following to see the result:</p>
      
      <form>
         <input type = "button" value = "Click Me" onclick = "myFunc();" />
      </form>      
   </body>
</html>

خروجی:

Value of variable a is : 100

اکنون ، بیایید این استثناء را با استفاده از ساختار try…catch امتحان کنیم و یک پیام کاربرپسند را نمایش دهیم. اگر بخواهیم این خطا را از کاربر پنهان کنیم ، می توانیم این پیام را نیز نمایش ندهیم.

<html>
   <head>
      
      <script type = "text/javascript">
         <!--
            function myFunc() {
               var a = 100;
               
               try {
                  alert("Value of variable a is : " + a );
               }
               catch ( e ) {
                  alert("Error: " + e.description );
               }
               finally {
                  alert("Finally block will always execute!" );
               }
            }
         //-->
      </script>
      
   </head>
   <body>
      <p>Click the following to see the result:</p>
      
      <form>
         <input type = "button" value = "Click Me" onclick = "myFunc();" />
      </form>
      
   </body>
</html>

خروجی:

Value of variable a is : 100

دستور throw

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

مثال

در مثال زیر توضیح داده شده که چطور می توانید از یک دستور throw استفاده کنید:

<html>
   <head>
      
      <script type = "text/javascript">
         <!--
            function myFunc() {
               var a = 100;
               var b = 0;
               
               try {
                  if ( b == 0 ) {
                     throw( "Divide by zero error." ); 
                  } else {
                     var c = a / b;
                  }
               }
               catch ( e ) {
                  alert("Error: " + e );
               }
            }
         //-->
      </script>
      
   </head>
   <body>
      <p>Click the following to see the result:</p>
      
      <form>
         <input type = "button" value = "Click Me" onclick = "myFunc();" />
      </form>
      
   </body>
</html>

خروجی:

Error: Divide by zero error.

می توانید با استفاده از یک رشته، عدد صحیح، Boolean، یا یک شیء، استثنا را در یک تابع ایجاد کنید و سپس همان استثنا را مانند مثال بالا در همان تابع و یا با استفاده از بلوک try…catch در تابع دیگری بگیرید.

متد onerror()

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

<html>
   <head>
      
      <script type = "text/javascript">
         <!--
            window.onerror = function () {
               alert("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>

خروجی:

An error occurred.

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

  • پیام خطا (Error message): پیا مشابهی که مرورگر برای خطای گرفته شده نمایش می دهد.
  • URL : فایل هر خطای رخ داده.
  • Line number: شماره خط در آدرسی که خطا رخ داده.

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

مثال:

<html>
   <head>
   
      <script type = "text/javascript">
         <!--
            window.onerror = function (msg, url, line) {
               alert("Message : " + msg );
               alert("url : " + url );
               alert("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>

خروجی:(3 تا خروجی)

Message : ReferenceError: myFunc is not defined

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

می توانیم از متد onerror ، همان طور که در کد زیر نشان داده شده است ، برای نمایش یک پیام خطا در صورت بروز هر گونه مشکل در بارگذاری یک تصویر استفاده کنیم.

<img src="myimage.gif" onerror="alert('An error occurred loading the image.')" />

می توانیم متد onerror را با بسیاری از تگ های HTML برای نمایش پیام های مناسب در صورت بروز خطا ، استفاده کنیم.