
در این بخش از سری آموزش جاوا اسکریپت قصد داریم به شما نحوه مدیریت خطا در جاوا اسکریپت (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 را برای خطا برگشت می دهد. می توانید از آن برای هدف دیباگ کردن استفاده کنید اما برای پروژه نهایی روی سایت از آن بهره نبرید.
امیدواریم در این بخش آموزش جاوا اسکریپت, از آموزش مدیریت خطا در جاوا اسکریپت نهایت استفاده را برده باشد.
هر سوالی داشتید ، از قسمت نظرات ارسال کنید . سریعا ، پاسخگوی سوالات شما هستیم .
موفق باشید.





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