خطاها اتفاق می افتند!
هنگام اجرای کد JavaScript، ممکن است خطاهای مختلفی رخ دهد.
خطاها می توانند:
- خطاهای کدنویسی ایجاد شده توسط برنامه نویس
- خطاهای ناشی از ورودی اشتباه
- و سایر موارد غیرقابل پیش بینی باشند... .
بعضی از خطاها باعث می شود ادامه کد اجرا نشود. به طور مثال در نمونه کد زیر به دلیل پیش آمدن خطا، ادامه کد اجرا نمی شود.
aaalllert("PNLdev"); // این خط به دلیل اشتباه در کد نویسی اجرا نمی شود.
// به دلیل خطا بالا بقیه کدهای JS نیز اجرا نمی شوند
alert("PNLdev");
برای کنترل این خطاها می توانیم از دستور try, catch استفاده کنیم.
try {
// بلوک کد
} catch (error) {
// بلوک مدیریت خطا
}
try {
aaalllert("PNLdev"); // خطایی به خط 5 پرتاب می شود
alert("PNLdev");
} catch(error) { // خطا پرتاب شده در خط 2 گرفته می شود
// در این بلوک می توانیم ادامه اجرای کد را کنترل کنیم
document.getElementById("demo").innerHTML = error.message;
}
نکته: در نمونه کد بالا، جاوا اسکریپت aaalllert را به عنوان یک خطا می گیرد و کد catch را برای کنترل خطا اجرا می کند.
دستور try و catch در JS
- دستور try به ما این امکان را می دهد که یک بلوک کد را تعریف کنیم تا در حین اجرا وقوع خطا را کنترل کنیم.
- دستور catch به ما این امکان می دهد که در صورت بروز خطا در بلوک try، در بلوک catch آن را کنترل کنیم.
دستور try و catch به همراه یکدیگر نوشته می شوند.
try {
// بلوک کد
} catch (error) {
// بلوک مدیریت خطا
}
دستور | توضیحات |
try (به معنی سعی کردن) | یک بلوک کد را اجرا می کند و در صورت رخ دادن خطا آن را به catch، پرتاب می کند. |
catch (به معنی گرفتن) | اگر در بلوک try خطایی رخ دهد، این بلوک کد آن را کنترل می کند. در غیر اینصورت اجرا نمی شود. |
finally | یک بلوک کد را، بدون توجه به بودن یا نبودن خطا، اجرا می کند. |
دستور finally در JS
عبارت finally به ما این امکان را می دهد که کد را پس از try و catch، بدون توجه به نتیجه، بلوک کدی را اجرا کنیم.
try {
// بلوک کد
} catch (error) {
// بلوک مدیریت خطا
} finally {
// پس از نمایان شدن نتیجه دو بلوک بالا اجرا می شود
}
try {
if(status == 'error') {
aaalllert("PNLdev");
} else if(status == 'valid') {
alert("PNLdev");
document.getElementById("demo").innerHTML = 'صحیح';
}
} catch(error) {
document.getElementById("demo").innerHTML = 'خطا';
} finally {
document.getElementById("demo").innerHTML += '-پایان';
}
عبارت throw در JS
در JS هنگامی که خطا رخ می دهد، معمولا اجرای کدها، متوقف شده و یک خطا ایجاد می شود.
نکته: به اصطلاح، یک خطا یا استثنا (Exception) پرتاب (throw) می شود.
عبارت throw، به ما این امکان را می دهد تا یک خطای سفارشی (شخصی سازی شده) ایجاد کنیم.
اگر از throw همراه با try و catch استفاده کنیم، می توانیم جریان برنامه را کنترل کنیم و پیام های خطای سفارشی ایجاد کنیم.
استثنا می تواند یک رشته، عدد، بولین یا یک شیء باشد.
try {
if(age == '') {
throw "لطفا سن خود را وارد کنید.";
} else if(isNaN(age)) {
throw "لطفا با عدد سن خود را وارد کنید.";
} else {
alert(`شما ${age} ساله هستید ;)`);
}
} catch(error) {
document.getElementById("result").innerHTML = error;
}
همچنان می توانیم با کمک شیء سراسری Error و ... یک استثنا را پرتاب کنیم.
نام خطاها | توضیحات |
RangeError | یک عدد (خارج از محدوده) رخ داده است. |
ReferenceError | یک مرجع غیرقانونی رخ داده است. |
SyntaxError | یک خطا در سینتکس رخ داده است. |
TypeError | یک خطا در نوشته یا متن (type) رخ داده است. |
URIError | خطایی در ()encodeURI رخ داده است. |
try {
if(age == '') {
throw new Error("لطفا سن خود را وارد کنید.", {cause: "required"});
} else if(isNaN(age)) {
throw new Error("لطفا با عدد سن خود را وارد کنید.", {cause: "numeric"});
} else if(age > 100) {
throw new RangeError("سن شما باید کمتر از 100 باشد.", {cause: "less than 100"});
} else {
alert(`شما ${age} ساله هستید ;)`);
}
} catch(error) {
document.getElementById("result").innerHTML = `${error.name}: ${error.message} (${error.cause})`;
}
شیء خطا
JavaScript دارای یک شیء خطای داخلی است که اطلاعات خطا را در صورت بروز خطا، ارائه می دهد.
شیء خطا دو ویژگی مفید را ارائه می دهد:
ویژگی ها | توضیحات |
نام | یک نام خطا را تنظیم یا برمی گرداند. |
پیام | یک پیام خطا (یک رشته) را تنظیم یا برمی گرداند. |
مقادیر نام خطاها
6 مقدار مختلف را می توان با ویژگی error name برگرداند:
- EvalError: خطایی در تابع ()eval رخ داده است.
- RangeError: یک عدد (خارج از محدوده) رخ داده است.
- ReferenceError: یک مرجع غیرقانونی رخ داده است.
- SyntaxError: یک خطا در سینتکس رخ داده است.
- TypeError: یک خطا در نوشته یا متن (type) رخ داده است.
- URIError: خطایی در ()encodeURI رخ داده است.
6 مقدار مختلف را در ادامه توضیح داده ایم:
1. خطای ارزیابی (Eval Error)
یک EvalError، نشان دهنده خطایی در تابع ()eval است.
نکته: نسخه های جدیدتر جاوا اسکریپت EvalError را پرتاب نمی کنند، به جای آن از SyntaxError استفاده کنید.
2. خطای محدوده (Range Error)
اگر ما از عددی استفاده کنیم که خارج از محدوده مقادیر قانونی باشد، RangeError پرتاب می شود.
به عنوان مثال: ما نمی توانیم تعداد ارقام قابل توجه یک عدد را روی 500 تنظیم کنیم:
let num = 1;
try {
num.toPrecision(500); // A number cannot have 500 significant digits
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
3. خطای مرجع (Reference Error)
اگر از متغیری استفاده کنیم که اعلام نشده است، یک ReferenceError پرتاب می شود:
let x = 5;
try {
x = y + 1; // y cannot be used (referenced)
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
4. خطای سینتکس (Syntax Error)
اگر بخواهیم کد را با خطای سینتکس، ارزیابی کنیم، یک SyntaxError پرتاب می شود:
try {
eval("alert('Hello)"); // Missing ' will produce an error
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
5. خطای نوشته یا متن (Type Error)
اگر یک عملوند یا آرگومان با نوع مورد انتظار یک عملگر یا تابع، ناسازگار باشد، TypeError پرتاب می شود:
let num = 1;
try {
num.toUpperCase(); // You cannot convert a number to upper case
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
6. خطای URI (Uniform Resource Identifier Error)
اگر از کاراکترهای غیرقانونی در یک تابع URI استفاده کنیم، یک URIError پرتاب می شود:
try {
decodeURI("%%%"); // You cannot URI decode percent signs
}
catch(err) {
document.getElementById("demo").innerHTML = err.name;
}
خلاصه ای از مقادیر نام خطاها
خلاصه درس
در این درس با خطاها (Errors) در JavaScript:
- انواع خطاها در JS
- خطاهای try و catch در JS
- خطای throw در JS
- عبارت throw در JS
- مثال اعتبارسنجی ورودی
- اعتبارسنجی HTML
- عبارت finally
- شیء خطا
- مقادیر نام خطاها:
- خطای ارزیابی (Eval Error)
- خطای محدوده (Range Error)
- خطای مرجع (Reference Error)
- خطای سینتکس (Syntax Error)
- خطای نوشته یا متن(Type Error)
- خطای URI (Uniform Resource Identifier Error)
آشنا شدیم.