دستورtry{ } يك بلوك كد كه ميخواهيد اجرا و كنترل نمائيد، تعريف ميكند.
دستورcatch{}براي گرفتن خطا ازبلوك try تعريف ميگردد .يعني اگر خطائي در آن رخ دهد دراين بلوك آن خطا مديريت ميشود.
دربلوك كدfinally{ }دستوراتي تعريف ميشود، كه بدون توجه نتيجه خطا اجرا ميگردد.
throw{ }بلوك كديست كه يك خطايابي سفارشي را معرفي ميكند .
هنگاميكه يك جاوااسكريپت كد اجرا ميشود، خطاهاي مختلفي ممكن است اتفاق بافتد:
مثال ـ در مثال عمدا براي نمونه دستورalert() به اشتباهadddlert() نوشته شده است.
<p id="demo"></p> <script> try { adddlert("Welcome guest!"); } catch(err) { document.getElementById("demo").innerHTML = err.message; } </script >
جاوااسكريپتadddlert() برايش ناشناخته بوده وبراي آن خطا ايجاد ميكند .اين خطا در بلوك كدcatch مديريت ميشود . شئerr براي خطاي ايجاد شده وmessage ويژگي آن است. مقدار اين ويژگي شرح خطاي ايجاديست.
دستورtry{ } اجازه ميدهد كه بلوك كدهائيكه ميخواهيد هنگام اجرا آزمايش خطائي شوند، بنويسيد.
دستورcatch{ }اجازه ميده كه بلوك كدي را بنويسد كه هنگام خطا در بلوكtry اجرا گردد وخطا را مديريت كند .
دستوراتtry و catch بعنوان يك زوج دستوري بفرم كلي زير استفاده ميشوند
try { Block of code to try } catch(err) { Block of code to handle errors }
هنگاميكه در اجرا خطائي پيش مي آيد، جاوااسكريپت بطول معمول اجرا را متوقف نموده و پيغام خطا را ايجاد ميكند .اصطلاح فني آن اينست كه جاوااسكريپت يك استثنا(exception) ايجاد وخطائي را پرتاب(throw an error) ميكند.
جاوااسكريپت در واقع با برخورد با خطا شئي(err) ايجاد ميكند .اين شئ داراي دو ويژگيname و message ميباشد .
با اين دستورthrowميتوان يك خطا يابي سفارشي ايجاد كرد .از بعد فني ميتوان يك استثنا ايجاد كرد.
استثناي ايجادي ميتواند يكي از مواردString , Number , Boolean or Object باشد:
throw "Too big"; // throw a text throw 500; // throw a number
اگرthrow را باtry , catch استفاده نمائيد، ميتوانيد مسير اجرا كنترل نموده ويك مديريت خطاي سفارشي ايجاد كنيد.
مثال ـ در اين مثال اگر ورودي مقدار اشتباهي داشته باشديك استثنا ايجاد(err) وپرتاب(throw) ميشود .استثنا بوسيله دستورcatch گرفته و خطاي اتفاق افتاده نمايش داده ميشود.
<!DOCTYPE html> <html> <body> <p Please input a number between 5 and 10:</p> <input id="demo" type="text"> <button type="button" onclick="myFunction()">Test Input <p id="p01"></p> <script> function myFunction() { const message = document.getElementById("p01"); message.innerHTML = ""; let x = document.getElementById("demo").value; try { if(x.trim() == "") throw "empty"; if(isNaN(x)) throw "not a number"; x = Number(x); if(x < 5) throw "too low"; if(x > 10) throw "too high"; } catch(err) { message.innerHTML = "Input is " + err; } } </script > </body> </html>
كد بالا يك مثال است .مرورگرهاي مدرن اغلب از تركيب جاوااسكريپت وتوابع اعتبار سنجي داخلي HTMLبا استفاده از روالها تعريف شده روي ويژگي آنان استفاده ميكنند .
<input id="demo" type="number" min="5" max="10" step="1">
ميتوانيد براي اطلاعات بيشتري در مورد اعتبارسنجي فرم ها به فصل هاي بعدي مراجعه كنيد .همچنين اين موضوع در بخشهاي مربوط بهHTML آمده است.
دستورfinally اجازه ميدهد كدهائي را بعد از try و catch بدون توجه به نتيجه آنها اجرا نمائيد .فرمت كلي آن مطابق زيراست:
try { Block of code to try } catch(err) { Block of code to handle errors } finally { Block of code to be executed regardless of the try / catch result }
مثال ـ دستورfinally
function myFunction() { const message = document.getElementById("p01"); message.innerHTML = ""; let x = document.getElementById("demo").value; try { if(x.trim() == "") throw "is empty"; if(isNaN(x)) throw "is not a number"; x = Number(x); if(x > 10) throw "is too high"; if(x < 5) throw "is too low"; } catch(err) { message.innerHTML = "Error: " + err + "."; } finally { document.getElementById("demo").value = ""; } }
جاوااسكريپت براي برخورد با خطا داراي شئ داخلي بنامerr ميباشد .اين شئ داراي دو ويژگي name وmessage براي نگهداري اطلاعات خطا است.
ويژگي | شــرح |
---|---|
name | نام خطا را تنظيم يا برگشت ميدهد. |
message | ييغام خطا را تنظيم يا برگشت ميدهد(string) . |
error name | شــرح |
---|---|
EvalError | خطاي ايجادي در تابعeval( ) |
RangError | هنگاميكه يك عدد خارج از محدوه ميشود. |
ReferenceError | يك مراجعه غير قابل قبول اتفاق بافتد |
SyntaxError | يك خطاي دستوري ياSyntax اتفاق بافتد |
TypeError | يك خطاي نوع(type) اتفاق بافتد . |
URIError | خطائي در تابعencodeURI( ) اتفاق بافتد. |
اين شش مقدار ويژگيname بدنبال تشريح ميشود .
EvalErrorخطائيكه در تابع eval() اتفاق مي افتد مشخص ميكند .
هر گز نسخه هاي جاوااسكريپتEvalError پرتاب نميكنند، بجايش SyntaxError ميباشد.
RangeErrorهنگامي اتفاق مي افتد كه مقدار در محدوده غير قابل قبول باشد .
براي مثال نمي توانيد تعداد ارقام مهم عددي را روي500 رقم تنظيم كنيد.
مثال ـ تنظيم غير قابل قبول ارقام عدد.
let num = 1; try { num.toPrecision(500); // A number cannot have 500 significant digits } catch(err) { document.getElementById("demo").innerHTML = err.name; }
ReferenceError هنگامي پرتاب ميشود كه از متغير تعريف نشده استفاده نمائيد . اين براي ارجاع به هر مورد ناشناخته مثل متغير، تابع و ...ميافتد.
مثال ـReferenceError
let x = 5; try { x = y + 1; // y cannot be used (referenced) } catch(err) { document.getElementById("demo").innerHTML = err.name; }
SyntaxErrorهنگامي اتفاق مي افتد كه يك كد با فرمت نادرست ارزيابي شود .يا بعبارتي دستور از نظر قوانين دستوري اشتباه باشد.
مثال ـ خطايSyntaxError
try { eval("alert('Hello)"); // Missing ' will produce an error } catch(err) { document.getElementById("demo").innerHTML = err.name; }
TypeErrorهنگامي اتفاق مي افتد كه عملي نا متناسب روي نوع داده انجام ميگيرد .
مثال ـ استفاده متدtoUpperCase() براي اعداد، كه غير قابل قبول است .اين متد مربوط به رشته هاست.
let num = 1; try { num.toUpperCase(); // You cannot convert a number to upper case } catch(err) { document.getElementById("demo").innerHTML = err.name; }
URIError هنگامي رخ ميدهد كه در توابعURI از كراكترهاي غير قابل قبول استفاده
شود
مثال ـ استفاده كراكتر% در رشته آرگومان تابع decodeURI( )
try { decodeURI("%%%"); // You cannot URI decode percent signs } catch(err) { document.getElementById("demo").innerHTML = err.name; }