الكلمات السابقة
تعتبر معالجة الأخطاء أمرًا بالغ الأهمية لتطوير تطبيقات الويب. لا يمكن أن يتنبأ بالأخطاء المحتملة مقدمًا ، ولا يمكن اعتماد استراتيجيات الاسترداد مقدمًا ، مما قد يؤدي إلى ضعف تجربة المستخدم. نظرًا لأن أي خطأ في JavaScript يمكن أن يتسبب في أن تكون صفحة الويب غير صالحة للاستعمال ، كمطور ، يجب أن تعرف متى ولماذا وماذا سيحدث. ستقدم هذه المقالة آلية معالجة الأخطاء في JavaScript بالتفصيل
كائن الخطأ
كائن الخطأ هو كائن يحتوي على معلومات الخطأ وهو كائن أصلي لـ JavaScript. عندما يحدث خطأ أثناء تحليل الكود أو تشغيله ، سيقوم محرك JavaScript تلقائيًا بإنشاء مثيل لكائن الخطأ ورميه تلقائيًا ، ثم يتم مقاطعة البرنامج بأكمله عند حدوث الخطأ.
console.log (t) ؛ // uncaughtederror: t غير محدد
تحدد ECMA-262 أن كائن خطأ يتضمن خصائصين: الرسالة والاسم. تحفظ سمة الرسالة رسالة الخطأ ، بينما تحفظ سمة الاسم نوع الخطأ
// عمومًا ، يتم استخدام عبارة TRAW-CATCH للقبض على خطأ ، TRAW {t ؛} catch (ex) {console.log (ex.message) ؛ // t غير محدد console.log (ex.name) ؛ // referenerRor}قام المتصفح أيضًا بتوسيع خصائص كائن الخطأ وأضاف المعلومات الأخرى ذات الصلة. من بينها ، أكثر شركات تصنيع المستعرضات تنفيذها هي سمة المكدس ، والتي تشير إلى معلومات تتبع المكدس (لا تدعمها Safari)
حاول {t ؛} catch (ex) {console.log (ex.stack) ؛ //@file: /// d: /wamp/www/form.html: 12: 2}بالطبع ، يمكنك استخدام مُنشئ ERROR () لإنشاء كائن خطأ. إذا تم تحديد معلمة الرسالة ، فسيستخدمها كائن الخطأ كخاصية للرسالة ؛ إذا لم يتم تحديدها ، فسيستخدم سلسلة افتراضية محددة مسبقًا كقيمة للخاصية
خطأ جديد () ؛ خطأ جديد (رسالة) ؛ // عمومًا ، استخدم عبارة رمي لرمي خطأ خطأ جديد ("اختبار") دالة usererror (message) {this.message = message ؛ this.name = "usererror" ؛} usererror.prototype = new error () ؛ usererror.prototype.constructor = usererror ؛ رمي المستخدم الجديد ("errormessage")عندما يتم استدعاء مُنشئ الخطأ () مباشرة مثل وظيفة دون استخدام المشغل الجديد ، فإن سلوكه هو نفسه عندما يتم استدعاء المشغل الجديد
خطأ () ؛ خطأ (رسالة) ؛ قم برمي الخطأ ("اختبار") ؛ // خطأ غير معلوم: خطأ في Trestthrow () ؛ // خطأ غير معطليحتوي كائن الخطأ على طريقة TOSTRING () ، والتي تُرجع سمة الرسالة لكائن الخطأ.
var test = خطأ جديد ('testerror') ؛ console.log (test.toString ()) ؛ // 'error: testerror'نوع الخطأ
هناك العديد من أنواع الأخطاء التي قد تحدث أثناء تنفيذ الكود. كل خطأ له نوع خطأ مقابل ، وعندما يحدث خطأ ، سيتم طرح كائن خطأ من النوع المقابل. يحدد ECMA-262 أنواع الأخطاء السبعة التالية:
errorevalerror (evalerror) rangeerror (rangeerror) مرجعية (مرجعية) بناء الجملة (Syntaxerror) typeerror (typeerror) urierror (urierror)
أينما ، يكون الخطأ هو النوع الأساسي ، وترث أنواع الأخطاء الأخرى من هذا النوع. لذلك ، تشترك جميع أنواع الأخطاء في مجموعة من نفس الخصائص. أخطاء نوع الخطأ نادرة ، وإذا كان هناك ، يتم إلقاؤها أيضًا من قبل المتصفح ؛ الغرض الرئيسي من هذا النوع الأساسي هو للمطورين رمي أخطاء مخصصة
【evalerror (خطأ في تقييم)】
عندما لا يتم تنفيذ وظيفة eval بشكل صحيح ، سيتم إلقاء خطأ evalerror. لم يعد نوع الخطأ هذا يظهر في ES5 ، ولكن سيتم الحفاظ عليه لضمان التوافق مع الرموز السابقة.
【RangeError (RangeError)】
سيتم تشغيل خطأ في نوع RangeError عندما تتجاوز القيمة النطاق المقابل ، بما في ذلك تجاوز نطاق طول الصفيف وتجاوز نطاق قيمة الأرقام.
صفيف جديد (-1) ؛ // uncagted RangeError: صفيف ذو طول غير صالح (رقم. max_value) ؛ // unciction Rangeerror: طول صفيف غير صالح (1234). يجب أن تتراوح حجة toexponential () بين 0 و 20
【ReferenceerRor (خطأ مرجعي)】
سيتم تشغيل ReferenceerRor عند الإشارة إلى خطأ متغير غير ثابت أو نوع LVALUE.
A ؛ // undistererror uncabled: A غير محدد 1 ++
【Syntaxerror (Syntaxerror)】
عندما لا يتم استيفاء قواعد بناء الجملة ، سيتم طرح بناء جملة (خطأ في بناء الجملة)
// خطأ الاسم المتغير var 1a ؛ // unticated syntaxerror: رقم غير متوقع // مفقود Bracket Console.log 'hello') ؛
【typeerror (خطأ في النوع)】
سيتسبب خطأ نوع Typeerror عند تخزين أنواع غير متوقعة في المتغيرات ، أو عند الوصول إلى طرق غير موجودة. على الرغم من أن أسباب الأخطاء متنوعة ، في النهاية ، فذلك لأن نوع المتغير لا يفي بالمتطلبات عند إجراء نوع محدد من التشغيل.
var o = new 10 ؛ // unduction typeerror: 10 ليس بنيًا (اسمًا "في true) ؛ // uncaught typeerror: لا يمكن استخدامه" في "المشغل للبحث عن" الاسم "
【urierror (خطأ URI)】
Urierror هو خطأ يتم إلقاؤه عندما تكون معلمات الوظائف المتعلقة باليوري غير صحيحة. يتضمن بشكل أساسي ست وظائف: Encodeuri () ، decodeuri () ، EncodeUricomponent () ، decodeuricomponent () ، Escape () و unescape ().
decodeuri ('٪ 2') ؛ // urierror: URI مشوهحدث الخطأ
أي أخطاء لا تتم معالجتها من خلال Try-Catch ستؤدي إلى حدوث حدث خطأ في كائن النافذة
يمكن أن يتلقى حدث الخطأ ثلاث معلمات: رسالة خطأ ، عنوان URL حيث يوجد الخطأ ، ورقم السطر. في معظم الحالات ، تكون رسائل الخطأ فقط مفيدة لأن عنوان URL يعطي موقع المستند فقط ، ويشير رقم السطر إلى سطر من التعليمات البرمجية التي يمكن أن تكون من رمز JavaScript المضمن أو من ملف خارجي.
لتحديد معالج حدث خطأ ، يمكنك استخدام تقنية مستوى DOM0 أو استخدام التنسيق القياسي لأحداث مستوى DOM2
// dom0 مستوى window.onerror = function (message ، url ، line) {Alert (message) ؛} // dom2 window.addeventListener ("error" ، function (message ، url ، line) {alert (message) ؛}) ؛ما إذا كان المتصفح يعرض رسالة خطأ قياسية تعتمد على قيمة إرجاع Onerror. إذا كانت قيمة الإرجاع خاطئة ، فسيتم عرض رسالة خطأ في وحدة التحكم ؛ إذا كانت قيمة الإرجاع صحيحة ، فلا يتم عرضها
// تعرض وحدة التحكم نافذة رسالة الخطأ. إرجاع false ؛} a ؛ // لا تعرض وحدة التحكم نافذة رسالة الخطأ. إرجاع صحيح ؛} أ ؛
معالج الحدث هذا هو خط الدفاع الأخير لتجنب أخطاء الإبلاغ عن المتصفح. من الناحية المثالية ، يجب ألا تستخدمه كلما كان ذلك ممكنًا. طالما أنه يمكنك استخدام بيان المحاولة بشكل مناسب ، فلن تكون هناك أخطاء تم تسليمها إلى المتصفح ولن يتم تشغيل حدث الخطأ.
تؤيد الصورة أيضًا أحداث الخطأ. طالما أن عنوان URL في خاصية SRC للصورة لا يمكنه إرجاع تنسيق الصورة المعترف به ، سيتم تشغيل حدث خطأ. في هذا الوقت ، يتبع حدث الخطأ تنسيق DOM ويعيد كائن حدث يستهدف الصورة كهدف
يظهر مربع تحذير عند تحميل الصورة. عند حدوث حدث خطأ ، انتهت عملية تنزيل الصورة ، مما يعني أنه لا يمكن تنزيله مرة أخرى.
var image = new image () ؛ image.src = 'smilex.gif' ؛ image.onerror = function (e) {console.log (e) ؛}رمي البيان ورمي الخطأ
يتم استخدام بيان الرمي لرمي خطأ. عند إلقاء خطأ ، يجب عليك تحديد قيمة لبيان الرمي. ما نوع هذه القيمة؟ لا يوجد شرط.
[ملاحظة] يتم حظر عملية رمي خطأ ، ولن يتم تنفيذ التعليمات البرمجية اللاحقة
رمي 12345 ؛ رمي "Hello World" ؛ رمي صحيح ؛ رمي {name: 'javaScript'} ؛يمكنك استخدام بيان الرمي لرمي كائن خطأ يدويًا
ارمي خطأً جديدًا ("حدث شيء سيء") ؛ رمي بناء جملة جديد ("أنا لا أحب بناء الجملة الخاص بك.") ؛ رمي نوع جديد ("ما نوع المتغير الذي تأخذني من أجله؟") ReferenceerRor ("أنت لم تذكر/" ر استشهد مراجعك بشكل صحيح ") ؛يمكن أن يؤدي استخدام سلاسل النموذج الأولي أيضًا إلى إنشاء أنواع خطأ مخصصة عن طريق وراثة خطأ (يتم تقديم سلاسل النموذج الأولي في الفصل 6). في هذه المرحلة ، تحتاج إلى تحديد سمات الاسم والرسائل لنوع الخطأ الذي تم إنشاؤه حديثًا
يعامل المتصفح أنواع الأخطاء المخصصة المخصصة من الخطأ تمامًا مثل أنواع الأخطاء الأخرى. يعد إنشاء خطأ مخصص مفيدًا إذا كنت تريد التقاط الخطأ الذي ترميه وعلاجه بشكل مختلف عن خطأ المتصفح.
وظيفة customerror (message) {this.name = 'customerror' ؛ this.message = message ؛} customerror.prototype = new error () ؛ رمي Customerror جديد ('رسالتي') ؛عند مواجهة بيان رمي ، سيتوقف الرمز على الفور. سيستمر الكود في التنفيذ فقط إذا قامت عبارة تجرب بتقاط القيمة التي تم إلقاؤها.
التفسير الأكثر تفصيلاً هو: عندما يتم طرح استثناء ، سيتوقف مترجم JavaScript على الفور من المنطق الذي يتم تنفيذه حاليًا ويقفز إلى معالج الاستثناء القريب. يتم كتابة معالج الاستثناء في بند الصيد من عبارة المحاولة. إذا كان كتلة الكود التي ترمي الاستثناء لا تحتوي على شرط الصيد المرتبط ، فسيقوم المترجم بالتحقق من كتلة التعليمات البرمجية المغلقة على المستوى الأعلى لمعرفة ما إذا كان لديه معالج استثناء مرتبط. وهكذا حتى يتم العثور على معالج الاستثناء. إذا كانت الوظيفة التي ترمي الاستثناء لا تتعامل مع بيان التجربة الخاص بها ، فسيتم نشر الاستثناء لأعلى إلى الكود الذي يستدعي الوظيفة. وبهذه الطريقة ، سيتم نشر الاستثناء لأعلى على طول الهيكل المعجمي لطريقة JavaScript ومكدس الاتصال. إذا لم يتم العثور على معالج استثناء ، فسوف يتعامل JavaScript مع الاستثناء كخطأ في البرنامج وإبلاغه بالمستخدم
جرب بيان الصيد والقبض على خطأ
يقدم ECMA-262 Edition 3 عبارة Try-Catch كطريقة قياسية للتعامل مع الاستثناءات في JavaScript ، وتستخدم للقبض على الأخطاء والتعامل معها
من بينها ، يحدد جملة Try Clause كتلة التعليمات البرمجية حيث توجد الاستثناءات التي يجب معالجتها. يتبع جملة Catch جملة Try. عندما يحدث استثناء في مكان ما في كتلة المحاولة ، يتم استدعاء منطق الكود داخل الصيد. يتبع شرط الصيد الكتلة أخيرًا ، حيث يتم وضع رمز التنظيف. بغض النظر عما إذا كان هناك استثناء في كتلة المحاولة ، سيتم دائمًا تنفيذ المنطق داخل الكتلة أخيرًا. على الرغم من أن الصيد وأخيراً اختياري ، فإن بند المحاولة يتطلب واحدة على الأقل من الاثنين لتشكيل بيان كامل معها.
يجب أن تكون جميع كتل البيان Try/Catch/أخيرًا محاطة بأقواس مجعد. الأقواس هنا مطلوبة. حتى لو كان هناك بيان واحد فقط في البند ، فلا يمكن حذف الأقواس المجعد.
حاول {// بشكل عام ، لن يتسبب الكود هنا في أي مشاكل // ولكن في بعض الأحيان سيتم طرح استثناء مباشرة من خلال بيان الرمي أو يتم إلقاؤه بشكل غير مباشر عن طريق استدعاء طريقة} catch (e) {// إذا وفقط تم إلقاء استثناء من خلال كتلة TRALE THE THE THE THE CODE هنا ، سيتم تنفيذ هذا الكود هنا. يمكن أيضًا إعادة إدخال الاستثناء من خلال بيان الرمي} أخيرًا {// بغض النظر عما إذا كانت عبارة TRY تطرح استثناءً ، وسيتم تنفيذ المنطق أخيرًا ، وسيتم تنفيذ طريقة إنهاء كتلة عبارة المحاولة هي: // 1. تنتهي بشكل طبيعي. بعد تنفيذ البيان الأخير من كتلة البيان // 2. إنهاء من خلال استراحة ، متابعة أو بيان الإرجاع // 3. رمي استثناء ، يتم القبض على الاستثناء من قبل جملة Catch // 4. رمي استثناء ، لا يتم القبض على الاستثناء ، والاستمرار في الانتشار لأعلى}بشكل عام ، ضع جميع الكود الذي قد يرمي أخطاء في كتلة TRIN
في حالة حدوث أي رمز في حظر TRALH ، سيتم الخروج على الفور عملية تنفيذ الكود وسيتم تنفيذ كتلة الصيد. في هذا الوقت ، ستتلقى كتلة الصيد كائنًا مع رسالة خطأ. ستختلف المعلومات الفعلية الواردة في هذا الكائن من المتصفح إلى المتصفح ، ولكن الشائع هو أن هناك سمة رسالة تخزن رسالة الخطأ
[ملاحظة] تأكد من تسمية كائن الخطأ. إذا إفراغه ، سيتم الإبلاغ عن خطأ في بناء الجملة.
جرب {q ؛} catch (خطأ) {ALERT (error.message) ؛ // Q غير محدد} // untaited syntaxerror: رمز غير متوقع) حاول {q ؛} catch () {ALERT (error.message) ؛}تقبل Catch معلمة تشير إلى القيمة التي ألقيتها كتلة رمز المحاولة
دالة رمي (استثناء) {جرب {رمي استثناء ؛ } catch (e) {console.log ('chaunt:'+ e) ؛ }} throwit (3) ؛ // acaught: 3throwit ('hello') ؛ // acaught: hellothrowit (خطأ جديد ("حدث خطأ ')) ؛ // صيد: خطأ: حدث خطأبعد أن يمسك كتلة رمز الصيد بالخطأ ، لن يتم مقاطعة البرنامج وسيستمر في التنفيذ وفقًا للعملية العادية.
جرب {رمي "خطأ" ؛} catch (e) {console.log (111) ؛} console.log (222) ؛ // 111 // 222من أجل التقاط أنواع مختلفة من الأخطاء ، يمكن إضافة بيانات الحكم إلى كتلة رمز الصيد
حاول {foo.bar () ؛} catch (e) {if (e exateof evalerror) {console.log (e.name + ":" + e.message) ؛ } آخر إذا (e eastyof rangeerror) {console.log (e.name + ":" + e.message) ؛ } // ...}على الرغم من أن البند الأخير اختياري في بيان المحاولة ، بمجرد استخدام البند الأخير ، سيتم تنفيذ رمزه بغض النظر عن السبب. وبعبارة أخرى ، يتم تنفيذ جميع الكود في كتلة TRAW بشكل طبيعي ، وسيتم تنفيذ الجمل أخيرًا ؛ إذا تم تنفيذ كتلة بيان catch بسبب خطأ ، فسيظل يتم تنفيذ الشرط الأخير. طالما أن الكود يحتوي على بنود أخيرًا ، بغض النظر عن الرمز الموجود في كتلة Try أو Catch - أو حتى عبارة الإرجاع ، فلن يتم منع تنفيذ البند أخيرًا.
// لم يتم القبض على الخطأ لأنه لا يوجد كتلة بيان الصيد. بعد تنفيذ كتلة الكود أخيرًا ، يقاطع البرنامج وظيفة Cleansup () حيث يتم طرح الخطأ. وظيفة cleansup () {try {رمي خطأ جديد ('خطأ ...') ؛ console.log ('لن يتم تنفيذ هذا الخط ") ؛ } أخيرًا {console.log ("أكمل عمل التنظيف") ؛ }} cleansup () ؛ // أكمل عمل التنظيف // خطأ: خطأ ... وظيفة testfinnally () {try {return 2 ؛ } catch (خطأ) {return 1 ؛ } أخيرًا {return 0 ؛ }} testfinnally () ؛ // 0[ملاحظة] يتم الحصول على قيمة عدد عبارة الإرجاع قبل تشغيل كتلة الرمز أخيرًا.
var count = 0 ؛ function countup () {try {return count ؛ } أخيرًا {count ++ ؛ }} countup () ؛ // 0console.log (count) ؛ // 1 الدالة f () {try {console.log (0) ؛ رمي "علة" ؛ } catch (e) {console.log (1) ؛ العودة صحيح. // قد تأخرت هذه الجملة حتى نهاية كتلة الكود أخيرًا قبل تنفيذ Console.log (2) ؛ // لن يتم تشغيل} أخيرًا {console.log (3) ؛ العودة كاذبة // سوف تكتب هذه الجملة وحدة إرجاع الجملة السابقة Console.log (4) ؛ // لن يتم تشغيل} console.log (5) ؛ // لن يتم تشغيل} var result = f () ؛ // 0 // 1 // 3console.log (result) ؛ // false【نصائح】 نطاق مستوى الكتلة
يتمثل أحد الاستخدامات الشائعة لبيانات التجربة في إنشاء نطاقات على مستوى الكتلة حيث تكون المتغيرات المعلنة صالحة فقط داخل المصيد
يقدم ES6 الكلمة الرئيسية Let Let لإنشاء نطاق على مستوى الكتلة للمتغيرات التي تعلن عنها. ومع ذلك ، في الوضع الحالي لـ ES3 و ES5 ، غالبًا ما تستخدم عبارات المحاولة لتحقيق تأثيرات مماثلة
من الكود التالي ، يوجد E فقط داخل جملة Catch ، وسيتم إلقاء خطأ عند محاولة الرجوع إليه من مكان آخر.
جرب {رمي خطأ جديد () ؛ // اختناق خطأ} catch (e) {console.log (e) ؛ // error (...)} console.log (e) ؛جوهر التعامل مع الأخطاء الشائعة هو معرفة الأخطاء أولاً في الكود. نظرًا لكتابة JavaScript بشكل فضفاض ولا تتحقق من معلمات الوظيفة ، فلن يحدث الخطأ إلا أثناء الرمز. بشكل عام ، يجب الاهتمام بثلاثة أنواع من الأخطاء: خطأ في تحويل النوع وخطأ نوع البيانات وخطأ الاتصال
【نوع خطأ التحويل】
يحدث خطأ في التحويل عند استخدام عامل تشغيل ، أو استخدام بنية لغة أخرى لأنواع البيانات التي قد تقوم بتحويل القيم تلقائيًا.
بيان التحكم في التدفق عرضة لكتابة أخطاء التحويل. عبارات مثل IF هل ستعمل تلقائيًا على تحويل أي قيمة إلى منطقية قبل تحديد العملية التالية. خاصة إذا كانت البيانات ، إذا تم استخدامها بشكل غير صحيح ، فمن المرجح أن ترتكب أخطاء.
يتم تعيين المتغيرات غير المستخدمة غير المستخدمة تلقائيًا قيمًا غير محددة. يمكن تحويل القيمة غير المحددة إلى قيمة منطقية خاطئة ، وبالتالي فإن العبارة في الوظيفة التالية تنطبق فعليًا فقط على الحالات التي يتم فيها توفير المعلمة الثالثة. المشكلة هي أنه ليس فقط غير محدد ليتم تحويله إلى خطأ ، كما أنه ليس فقط قيم السلسلة التي يمكن تحويلها إلى صواب. على سبيل المثال ، إذا كانت المعلمة الثالثة هي القيمة 0 ، فإن اختبار IF سوف يفشل ، وسيمر اختبار القيمة اللوغاريتمية 1
CORCAT (STR1 ، STR2 ، STR3) {var result = str1 + str2 ؛ if (str3) {// بالتأكيد لا نتاج += str3 ؛ } نتيجة الإرجاع ؛}يعد استخدام القيم غير البليان في عبارات التحكم في التدفق مصدرًا شائعًا للغاية للأخطاء. لتجنب مثل هذه الأخطاء ، من الضروري تمرير القيم المنطقية عند مقارنة الظروف. في الواقع ، يمكن لأداء بعض أشكال المقارنة تحقيق ذلك
CORCAT (STR1 ، STR2 ، STR3) {var result = str1 + str2 ؛ if (typeof str3 == 'string') {// نتيجة أكثر ملاءمة += str3 ؛ } نتيجة الإرجاع ؛}【خطأ نوع البيانات】
تتم كتابة JavaScript بشكل فضفاض ولن تتم مقارنتها للتأكد من أن نوع بياناتهم صحيح حتى يتم استخدام المتغيرات ومعلمات الوظائف. من أجل التأكد من عدم حدوث أخطاء نوع البيانات ، يمكن كتابة رمز اكتشاف نوع البيانات المناسب فقط. من المرجح أن تحدث أخطاء نوع البيانات عند تمرير قيم غير متوقعة لمرض الوظائف
// وظائف غير آمنة ، فإن أي قيمة غير عصيدة ستؤدي إلى انعكاس وظيفة الخطأ (القيم) {if (القيم) {valud.sort () ؛ القيم. Reverse () ؛ }}خطأ شائع آخر هو مقارنة المعلمات مع القيم الخالية. إن مقارنة مع NULL فقط يضمن أن القيم المقابلة ليست فارغة وغير محددة. لضمان أن القيمة التي تم تمريرها صالحة ، لا يكفي اكتشاف القيم الفارغة فقط
// وظائف غير آمنة ، فإن أي قيمة غير عصيدة ستؤدي إلى انعكاس وظيفة الخطأ (القيم) {if (القيم! = null) {dord.sort () ؛ القيم. Reverse () ؛ }}إذا تم تمرير كائن يحتوي على طريقة SORT () (بدلاً من صفيف)
// وظائف غير آمنة ، فإن أي قيمة غير عصيدة ستؤدي إلى عكس دالة الخطأ (القيم) {if (typeof stable.sort == 'function') {values.sort () ؛ القيم. Reverse () ؛ }}في حال كنت تعرف بالضبط النوع الذي يجب أن تنقله ، فمن الأفضل استخدام مثيل لاكتشاف نوع البيانات الخاص به
// يتم تجاهل القيم الآمنة ، غير المجردة للدالة (القيم) {if (dorder extryof array) {values.sort () ؛ القيم. Reverse () ؛ }}【خطأ في الاتصال】
مع ظهور برمجة Ajax ، أصبح من الشائع لتطبيقات الويب تحميل المعلومات أو الوظائف ديناميكيًا خلال دورة حياتهم. ومع ذلك ، قد يتسبب أي اتصال بين JavaScript والخادم في حدوث خطأ
المشكلة الأكثر شيوعًا هي أن البيانات لا يتم ترميزها باستخدام EncodeUricomponent () قبل إرسالها إلى الخادم
// خطأ http://www.yourdomain.com/؟redir=http:٪3A٪2F٪2FWWW.SometherDomain.com٪3FA٪3DB٪26C٪3DD
تتفهم المقالة أعلاه بشكل شامل آلية معالجة الأخطاء في JavaScript. هذا هو كل المحتوى الذي أشاركه معك. آمل أن تتمكن من إعطائك مرجعًا وآمل أن تتمكن من دعم wulin.com أكثر.