در این بخش از سری آموزش جاوا اسکریپت قصد داریم به شما نحوه مدیریت خطا در جاوا اسکریپت (error handling) را آموزش بدیم.
مدیریت خطا (Error Handling)
بعضی اوقات کدهای جاوا اسکریپت شما به آن سادگی که انتظار داشتید اجرا نمی شود و دارای خطا هستند.
تعداد از دلایلی که باعث ایجاد خطا می شود می تواند برای مثال :
- یک مشکل در ارتباط شبکه (شاید اینترنت)
- ممکن است کاربر یک مقدار نامعتبر را در فیلد فرم وارد کند
- توابع یا آبجکت های اشاره شده وجود ندارند.
- داده های نامعتبر به سمت سرور ارسال یا دریافت شده است.
- یک سرویس که در اپلیکشن خود نیاز دارید موقتا غیرقابل دسترس است.
این انواع خطاهای معروف در هنگام اجرا (runtime) است چرا که در حین اجرای اسکریپت رخ می دهند.
یک اپلیکیشن حرفه ای باید قابلیت مدیریت این چنین خطاهایی را داشته باشد. معمولا به این معنا که کاربر را در مورد مشکل ایجاد شده بیشتر و واضح تر آگاه کند.
دستور try…catch
جاوا اسکریپت دستور try-catch را برای به دام انداختن خطاهای run-time و مدیریت آن ها ارایه داده است.
هر کدی که این امکان وجود دارد که باعث ایجاد خطا شود باید در بلاک try
قرار بگیرد و کد برای مدیریت این خطا نیز در بخش catch
قرار بگیرد.
1 2 3 4 5 |
try { // Code that may cause an error } catch(error) { // Action to be performed when an error occurs } |
اگر هر خطایی در بلاک try
رخ دهد, اجرای کد سریعا از بلاک try
به بلاک catch
منتقل می شود.
اگر خطایی در بلاک try
وجود نداشته باشد, بلاک catch نادیده گرفته می شود و برنامه بعد از دستور try-catch
به اجرای خود ادامه می دهد.
مثال زیر به شما نحوه کار دستور try-catch
را نشان می دهد :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
try { var greet = "Hi, there!"; document.write(greet); // Trying to access a non-existent variable document.write(welcome); // If error occurred following line won't execute alert("All statements are executed successfully."); } catch(error) { // Handle the error alert("Caught error: " + error.message); } // Continue execution document.write("<p>Hello World!</p>"); |
اسکریپت بالا یک خطا را در پنجره پیام هشدار alert
به جای قرار دادن آن در کنسول را نشان می دهد.
به علاوه, این برنامه حتی با وجود خطا بصورت ناگهانی متوقف نمی شود.
همچنین, توجه کنید که کلمه کلیدی catch
به همراه یک شناسه داخل پارانتز است. این شناسه همانند یک پارامتر تابع عمل می کند.
زمانی که یک خطا رخ می دهد, مفسر جاوا اسکریپت یک آبجکت شامل اطلاعاتی درباره آن خطا را ایجاد می کند. این آبجکت به آرگومان در catch
برای مدیریت آن پاس داده می شود.
نکته: دستور try-catch
یک مکانیزم مدیریت خطا در جاوا اسکریپت است. یک استثنا (exception
) سیگنالی است که نشان می دهد که نوعی شرایط استثنایی یا یک خطا (error
) حین اجرای برنامه رخ داده است. اصطلاحات “error” خطا یا “exception” معمولا به جای هم دیگر نیز استفاده می شوند.
دستور try…catch…finally
دستور try-catch
می تواند finally
هم داشته باشد. کد داخل finally
همیشه اجرا می شود چه خطایی در بلاک try
رخ دهد چه رخ ندهد.
مثال زیر به شما همیشه کل زمانی که طول می کشد تا کد اجرا شود را نشان می دهد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// Assigning the value returned by the prompt dialog box to a variable var num = prompt("Enter a positive integer between 0 to 100"); // Storing the time when execution start var start = Date.now(); try { if(num > 0 && num <= 100) { alert(Math.pow(num, num)); // the base to the exponent power } else { throw new Error("An invalid value is entered!"); } } catch(e) { alert(e.message); } finally { // Displaying the time taken to execute the code alert("Execution took: " + (Date.now() - start) + "ms"); } |
پرتاب خطا (Throwing Errors)
همانطور که دیدید مفسر جاوا اسکریپت بصورت خودکار خطایی را هنگام رخ دادن آن ایجاد می کند. به هرحال شما نیز می توانید بصورت دستی با throw
یک خطا ایجاد کنید.
فرم کلی (یا سینتکس) دستور throw
بصورت throw expression
است.
expression می تواند یک شیء یا مقداری از هر نوع داده ای باشد. به هر حال, بهتر است که از آبجکت ها, ترجیحا با خصوصیت name
و message
باشد.
متد سازنده Error()
در جاوا اسکریپت یک راه آسان را برای ساخت یک آبجکت خطا را ارایه داده است.
1 2 3 4 5 |
throw 123; throw "Missing values!"; throw true; throw { name: "InvalidParameter", message: "Parameter is not a number!" }; throw new Error("Something went wrong!"); |
نکته: اگر از توابع built-in سازنده خطا (مانند Error()
, TypeError()
و ..) برای ساخت آبجکت های خطا استفاده کنید, پس خصوصیت name
مشابه نام متد سازنده است و message
نیز برابر آرگومان پاس داده شده به تابع سازنده است.
حالا قصد داریم یک تابع squareRoot()
برای پیدا کردن جزر عدد استفاده کنیم. می توانیم این کار را با تابع Math.sqrt()
انجام بدیم اما مشکل اینجاست که برای اعداد منفی مقدار NaN
را بدون هیچ گونه خطا یا اشاره ای, برگشت می دهد.
قصد داریم این مشکل را با پرتاب یک خطای سفارشی برای اعدادی که منفی هستند حل کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
function squareRoot(number) { // Throw error if number is negative if(number < 0) { throw new Error("Sorry, can't calculate square root of a negative number."); } else { return Math.sqrt(number); } } try { squareRoot(16); squareRoot(625); squareRoot(-9); squareRoot(100); // If error is thrown following line won't execute alert("All calculations are performed successfully."); } catch(e) { // Handle the error alert(e.message); } |
نکته: از لحاظ تئوری امکان محاسبه جز عدد منفی با اعداد تخیلی i که i2 = -1 می باشد, امکان پذیر است. بنابراین جزر -۴
برابر ۲i
و جزر -۹
برابر -۹
برابر ۳i
می باشد. اما خب اعداد تخیلی در جاوا اسکریپت پشتیبانی نمی شوند.
انواع خطاها
شیء Error
یک نوع پایه از همه خطاها است و دارای دو خصوصیت name
که نوع خطا را مشخص می کند و خصوصیت message
که توضیحی برای اطلاعات بیشتر در مورد خطا است.
هر خطای ایجاد شده می تواند نمونه از شیء Error
باشد.
چتدین نوع خطای مختلف می توانید هنگام اجرای برنامه جاوا اسکریپت مثل RangeError
, ReferenceError
, SyntaxError
, TypeError
, URIError
ایجاد شود.
بخش زیر هر یک از این خطا ها را با جزییات شرح می دهد.
RangeError
یک RangeError
زمانی که از عددی خارج از محدوده قابل قبول استفاده کنید, رخ می دهد.
برای مثال, ساخت یک آرایه با طور منفی خطای RangeError
را پرتاب می کند.
1 2 3 4 |
var num = 12.735; num.toFixed(200); // throws a range error (allowable range from 0 to 100) var array = new Array(-1); // throws a range error |
ReferenceError
یک ReferenceError
معمولا زمانی که قصد دسترسی به یک رفرنس یا متغیر یا شیء ای که وجود ندارد, دارید, رخ می دهد.
1 2 3 4 5 6 |
var firstName = "Harry"; console.log(firstname); // throws a reference error (variable names are case-sensitive) undefinedObj.getValues(); // throws a reference error nonexistentArray.length; // throws a reference error |
SyntaxError
یک SyntaxError
در زمان اجرا پرتاب می شود اگر خطایی نوشتاری در کد جاوا اسکریپت شما وجود داشته باشد.
مثلا اگر براکت را نبندید, ساختار حلقه ها به درستی مشخص نشود و …
1 2 3 4 |
var array = ["a", "b", "c"]; document.write(array.slice(2); // throws a syntax error (missing bracket) alert("Hello World!'); // throws a syntax error (quote mismatch) |
TypeError
یک TypeError
زمانی که یک مقدار, نوع مورد انتظار نیست, پرتاب می شود. برای مثال, صدا زدن یک متد رشته روی عدد, صدا زدن یک متد آرایه روی رشته و …
1 2 3 4 5 |
var num = 123; num.toLowerCase(); /* throws a type error (since toLowerCase() is a string method, a number can't be converted to lowercase) */ var greet = "Hello World!" greet.join() // throws a type error (since join() is an array method) |
URIError
یک URIError
زمانی که مقدار URL یا آدرس مربوط به توابع encodeURI()
یا decodeURI()
نامعتبر باشد, رخ می دهد.
1 2 3 4 5 |
var a = "%E6%A2%B"; decodeURI(a); // throws a URI error var b = "\uD800"; encodeURI(b); // throws a URI error |
نکته: یک نوع خطای دیگر به نام EvalError
نیز وجود دارد که هنگام وجود خطا در اجرای کد با تابع eval()
رخ می دهد. اما, این خطا دیگر توسط جاوا اسکریپت پرتاب یا throw
نمی شود. به هرحال این شیء همچنان برای سازگاری عقب مانده است.
نوع خطای مشخصی را نیز هنگام استفاده از دستور throw
می توانید بصورت دستی مشخص کنید.
برای پرتاب یک TypeError
می توانید از متد سازنده TypeError()
مثل زیر استفاده کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var num = prompt("Please enter a number"); try { if(num != "" && num !== null && isFinite(+num)) { alert(Math.exp(num)); } else { throw new TypeError("You have not entered a number."); } } catch(e) { alert(e.name); alert(e.message); alert(e.stack); // non-standard property } |
نکته: آبجکت Error
همچنین خصوصیات غیراستاندارد را پشتیبانی می کند. یکی از پر استفاده ترین خصوصیات stack
است که یک stack trace را برای خطا برگشت می دهد. می توانید از آن برای هدف دیباگ کردن استفاده کنید اما برای پروژه نهایی روی سایت از آن بهره نبرید.
امیدواریم در این بخش آموزش جاوا اسکریپت, از آموزش مدیریت خطا در جاوا اسکریپت نهایت استفاده را برده باشد.
هر سوالی داشتید ، از قسمت نظرات ارسال کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق باشید.
با سلام وقت بخیر
برای جلوگیری از ورود اعداد در فیلد ورودی از چه دستوری باید استفاده کرد لطفا راهنمایی کنید
سلام ممنون
لطفا آموزش اعتبارسنجی فرم در جاوااسکریپت رو مطالعه کنید
موفق باشید.