خطاها - رخ دادن خطا و رفع آن

از ویکی‌کد، دانشنامهٔ برنامه‌نویسی
پرش به ناوبری پرش به جستجو

عبارت try به شما اجازه می‌دهد بلاکی از کد را برای خطاها بررسی کنید. [۱]

عبارت catch به شما اجازه می‌دهد که خطا را مدیریت کنید.

عبارت throw به شما اجازه می‌دهد یک خطای شخصی‌سازی شده ایجاد کنید.

عبارت finally به شما اجازه می‌دهد بعد از بلاک‌های Try و catch بدون در نظر گرفتن نتایج آن‌ها، کد خود را اجرا کنید.

خطاها اتفاق خواهند افتاد!

در زمان اجرای کدهای جاوا اسکریپت، خطاهای مختلفی می‌توانند رخ دهند.

خطاها می‌توانند خطاهای کد باشند که توسط برنامه‌نویس ایجاد شده‌اند، خطاهایی به خاطر ورود داده اشتباه و سایر موارد.

مثال

در این مثال، ما یک هشدار را به صورت adddlert برای ایجاد یک خطا، ایجاد کرده‌ایم:

 1<p id="demo"></p>
 2
 3<script>
 4try {
 5  adddlert("Welcome guest!");
 6}
 7catch(err) {
 8  document.getElementById("demo").innerHTML = err.message;
 9}
10</script>


مشاهدهٔ نتیجه


جاوا اسکریپت adddlert را به صورت یک خطا (error) در نظر می‌گیرد و بلاک Catch را برای مدیریت خطای آن اجرا می‌کند.

دستور Try و catch در جاوا اسکریپت

عبارت try به شما این اجازه می‌دهد که بلاکی از کد را در زمان اجرا برای یافتن خطاهایش بررسی کنید.

عبارت catch به شما این اجازه را می‌دهد که یک بلاک از کد را برای زمانی که یک خطا در بلاک Try رخ داد، مشخص کنید.عبارت‌های جاوا اسکریپت یعنی try و catch با هم نوشته می‌شوند:

1try {
2  Block of code to try
3}
4catch(err) {
5  Block of code to handle errors
6}

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

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

این عمل جاوا اسکریپت را ایجاد یک خطا (throw an error) می‌نامند.

جاوا اسکریپت معمولاً یک شیء Error با دو ویژگی name و message نیز ایجاد می‌کنند.

عبارت throw

عبارت throw به شما این اجازه را می‌دهد که یک خطای شخصی‌سازی شده ایجاد کنید.

از نظر فنی، شما می‌توانید یک خطا ایجاد کنید.

خطا می‌تواند یک رشته متنی String ، یک عدد Number ، یک بولین Boolean یا یک شیء Object باشد:

1throw "Too big";    // throw a text
2throw 500;          // throw a number

اگر شما از کلمه throw به همراه try و catch استفاده کنید، شما می‌توانید جریان برنامه را کنترل کنید و پیغام خطاهای شخصی‌سازی شده ایجاد کنید.

مثال بررسی داده ورودی

در این مثال مقدار ورودی بررسی می‌شود. اگر مقدار ورودی غلط باشد یک خطا (exception) ایجاد می‌شود.

خطا یا Exception توسط بلاک Catch دریافت می‌شود و یک پیغام خطای شخصی‌سازی شده نمایش پیدا می‌کند:

 1<!DOCTYPE html>
 2<html>
 3<body>
 4
 5<p>Please input a number between 5 and 10:</p>
 6
 7<input id="demo" type="text">
 8<button type="button" onclick="myFunction()">Test Input</button>
 9<p id="p01"></p>
10
11<script>
12function myFunction() {
13  var message, x;
14  message = document.getElementById("p01");
15  message.innerHTML = "";
16  x = document.getElementById("demo").value;
17  try {
18    if(x == "") throw "empty";
19    if(isNaN(x)) throw "not a number";
20    x = Number(x);
21    if(x < 5) throw "too low";
22    if(x > 10) throw "too high";
23  }
24  catch(err) {
25    message.innerHTML = "Input is " + err;
26  }
27}
28</script>
29
30</body>
31</html>


مشاهدهٔ نتیجه


اعتبار سنجی در HTML

کد بالا فقط یک مثال است.

مرورگرهای مدرن اغلب از مجموعه ای از اعتبارسنجی‌های درونی جاوا اسکریپت و html با استفاده از قوانین اعتبار سنجی از قبل تعریف شده در ویژگی‌ها یا Attribute های HTML استفاده می‌کنند:

<input id="demo" type="number" min="5" max="10" step="1">

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

عبارت finally

عبارت finally به شما اجازه می‌دهد بعد از بلاک Try و Catch بدون توجه به نتیجه آن‌ها کد مورد نظر خود را اجرا کنید:

شیوهٔ نوشتار

1try {
2  Block of code to try
3}
4catch(err) {
5  Block of code to handle errors
6}
7finally {
8  Block of code to be executed regardless of the try / catch result
9}

مثال

 1function myFunction() {
 2  var message, x;
 3  message = document.getElementById("p01");
 4  message.innerHTML = "";
 5  x = document.getElementById("demo").value;
 6  try {
 7    if(x == "") throw "is empty";
 8    if(isNaN(x)) throw "is not a number";
 9    x = Number(x);
10    if(x > 10) throw "is too high";
11    if(x < 5) throw "is too low";
12  }
13  catch(err) {
14    message.innerHTML = "Error: " + err + ".";
15  }
16  finally {
17    document.getElementById("demo").value = "";
18  }
19}


مشاهدهٔ نتیجه


شیء خطا (Error Object)

به صورت پیشفرض جاوا اسکریپت یک شی خطا یا Error دارد که زمانی یک ارور رخ می‌دهد، اطلاعاتی را در مورد خطا به ما ارائه می‌دهد.

شی خطا یا Error دو ویژگی پر استفاده دارد: نام و پیام

ویژگی‌های شیء خطا (Error Object)

ویژگی توضیحات
Name نام خطا را می‌توان تنظیم کرد یا نام خطای رخ داده شده را به ما برمی‌گرداند.
Message پیغام خطا را می‌توان تنظیم کرد یا پیغام خطای رخ داده شده را به ما برمی‌گرداند.

مقادیر ویژگی Name شیء خطا (Error Object)

۶ نوع مقدار متفاوت می‌تواند توسط ویژگی name خطا یا Error به ما برگردانده شود:

نام خطا توضیحات
EvalError یک ارور یا خطا در تابع eval() رخ داده‌است.
RangeError یک عدد خارج از محدوده مجاز قرار دارد.
ReferenceError مشکل دسترسی به مرجع وجود دارد.
SyntaxError شیوه نوشتن دستور مشکل دارد.
TypeError خطای مربوط به نوع داده رخ داده‌است.
URIError یک خطا در متد encodeUri() رخ داده‌است.

۶ مقدار متفاوت بالا در ادامه توضیح داده شده‌اند.

خطای Eval

یک خطای EvalError مشخص می‌کند که در تابع eval() یک خطا رخ داده‌است.

نسخه‌های جدیدتر جاوا اسکریپت در این هنگام خطای SyntaxError به جای EvalError را ایجاد می‌کنند.

خطای Range (به فارسی: محدوده)

یک خطای RangeError زمانی رخ می‌دهد که یک عدد از محدوده قانونی خود خارج باشد.

برای مثال: شما نمی‌توانید تعداد ارقام مهم یک عدد را برابر با ۵۰۰ قرار دهید.

مثال

1var num = 1;
2try {
3  num.toPrecision(500);   // A number cannot have 500 significant digits
4}
5catch(err) {
6  document.getElementById("demo").innerHTML = err.name;
7}


مشاهدهٔ نتیجه


خطای Refrence (به فارسی: مرجع)

یک ReferenceError زمانی رخ می‌دهد که شما از متغیری که تعریف نشده‌است در برنامه خود استفاده کنید:

مثال

1var x;
2try {
3  x = y + 1;   // y cannot be referenced (used)
4}
5catch(err) {
6  document.getElementById("demo").innerHTML = err.name;
7}


مشاهدهٔ نتیجه


خطای شیوه نوشتار (syntax)

یک خطای نوشتار یا SyntaxError زمانی رخ می‌دهد که شما سعی کنید یک کد را با یک خطای نوشتاری اجرا کنید.

مثال

1try {
2  eval("alert('Hello)");   // Missing ' will produce an error
3}
4catch(err) {
5  document.getElementById("demo").innerHTML = err.name;
6}


مشاهدهٔ نتیجه


خطای نوع (Type)

یک خطای نوع یا TypeError زمانی رخ می‌دهد که شما از مقداری استفاده کنید که از محدوده نوع داده‌های مجاز خارج باشد:

مثال

1var num = 1;
2try {
3  num.toUpperCase();   // You cannot convert a number to upper case
4}
5catch(err) {
6  document.getElementById("demo").innerHTML = err.name;
7}


مشاهدهٔ نتیجه


URI (تعیین کنندهٔ هویت منبع یکنواخت)

یک خطای URIError زمانی اتفاق می‌افتد که شما از کاراکترهای غیرقابل قبول در یک تابع URI استفاده کنید:

مثال

1try {
2  decodeURI("%%%");   // You cannot URI decode percent signs
3}
4catch(err) {
5  document.getElementById("demo").innerHTML = err.name;
6}


مشاهدهٔ نتیجه


ویژگی های غیر استاندارد شیء خطا (Error Object)

موزیلا و ماکروسافت تعدادی ویژگی غیر استاندارد برای شی خطا یا error object تعریف کرده‌اند:

  • نام فایل (موزیلا)
  • شماره خط (موزیلا)
  • شماره ستون (موزیلا)
  • استک (موزیلا)
  • توضیحات (ماکروسافت)
  • شماره (ماکروسافت)

از این ویژگی‌ها برای وب‌سایت‌های عمومی استفاده نکنید. این ویژگی در تمامی مرورگرها کار نخواهند کرد.

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

برای مشاهده مرجع کامل از شیء خطا (Object) می‌توانید مقاله ما را تحت عنوان مرجع کامل خطا در جاوا اسکریپت بخوانید.


منابع آموزشی