معالجة الاستثناءات

في مجال الحوسبة وبرمجة الحاسوب ، تُعرف معالجة الاستثناءات بأنها عملية الاستجابة لحدوث الاستثناءات - وهي حالات شاذة أو استثنائية تتطلب معالجة خاصة - أثناء تنفيذ البرنامج . بشكل عام، يُوقف الاستثناء التدفق الطبيعي للتنفيذ ويُفعّل معالج استثناءات مُسجّل مسبقًا ؛ وتعتمد تفاصيل كيفية القيام بذلك على ما إذا كان الاستثناء متعلقًا بالأجهزة أو بالبرمجيات، وكيفية تنفيذ الاستثناء البرمجي.

تُعرَّف الاستثناءات بواسطة طبقات مختلفة من نظام الحاسوب، وتشمل هذه الطبقات عادةً المقاطعات التي يُعرّفها المعالج ، والإشارات التي يُعرّفها نظام التشغيل ، والاستثناءات التي تُعرّفها لغة البرمجة . تتطلب كل طبقة طرقًا مختلفة للتعامل مع الاستثناءات، على الرغم من إمكانية ترابطها، فمثلاً، يمكن تحويل مقاطعة المعالج إلى إشارة من نظام التشغيل. بعض الاستثناءات، وخاصةً تلك المتعلقة بالأجهزة، يمكن التعامل معها بسلاسة بحيث يُمكن استئناف التنفيذ من حيث توقف.

تعريف

يستند تعريف الاستثناء إلى ملاحظة أن لكل إجراء شرطًا مسبقًا ، وهو مجموعة من الظروف التي عندها ينتهي الإجراء "بشكل طبيعي". [ 1 ] تسمح آلية معالجة الاستثناءات للإجراء بإثارة استثناء [ 2 ] إذا تم انتهاك هذا الشرط المسبق، [ 1 ] على سبيل المثال إذا تم استدعاء الإجراء بمجموعة غير طبيعية من الوسائط. ثم تعالج آلية معالجة الاستثناء هذا الاستثناء. [ 3 ]

إن الشرط المسبق وتعريف الاستثناء أمران شخصيان . فمجموعة الظروف "العادية" يحددها المبرمج بالكامل، فعلى سبيل المثال، قد يعتبر القسمة على صفر عملية غير معرفة، وبالتالي تُعدّ استثناءً، أو قد يبتكر سلوكًا ما مثل إرجاع الصفر أو قيمة خاصة تُسمى "القسمة على صفر" (متجاوزًا بذلك الحاجة إلى الاستثناءات). [ 4 ] تشمل الاستثناءات الشائعة وسيطًا غير صالح (مثل أن تكون القيمة خارج نطاق دالة[ 5 ] أو موردًا غير متاح (مثل ملف مفقود، [ 6 ] أو خطأ في محرك الأقراص الشبكي، [ 7 ] أو أخطاء نفاد الذاكرة [ 8 ] )، أو أن الروتين قد اكتشف حالة عادية تتطلب معالجة خاصة، مثل الانتباه أو نهاية الملف. [ 9 ] يُعدّ الضغط الاجتماعي عاملًا مؤثرًا بشكل كبير على نطاق الاستثناءات واستخدام آليات معالجة الاستثناءات، أي "أمثلة الاستخدام، الموجودة عادةً في المكتبات الأساسية، وأمثلة التعليمات البرمجية في الكتب التقنية ومقالات المجلات ومنتديات النقاش عبر الإنترنت، وفي معايير التعليمات البرمجية للمؤسسة". [ 10 ]

تُعالج معالجة الاستثناءات مشكلة شبه المسند ، إذ تُميّز هذه الآلية بين قيم الإرجاع الطبيعية والخاطئة. في اللغات التي لا تتضمن معالجة استثناءات مُدمجة، مثل لغة C، تحتاج الإجراءات إلى الإشارة إلى الخطأ بطريقة أخرى، مثل رمز الإرجاع الشائع ونمط errno . [ 11 ] من منظور أوسع، يُمكن اعتبار الأخطاء مجموعة فرعية من الاستثناءات، [ 12 ] كما يُمكن اعتبار آليات الخطأ الصريحة، مثل errno، أشكالًا (مُفصّلة) لمعالجة الاستثناءات. [ 11 ] يُفضّل استخدام مصطلح "استثناء" على "خطأ" لأنه لا يُشير بالضرورة إلى وجود خطأ ما - فما يعتبره إجراء أو مُبرمج خطأً قد لا يعتبره آخر كذلك. [ 13 ]

قد يكون مصطلح "استثناء" مُضللاً، إذ يوحي معناه "الشذوذ" بأن إطلاق الاستثناء أمر غير طبيعي أو غير معتاد، [ 14 ] بينما في الواقع قد يكون إطلاق الاستثناء حالة طبيعية ومألوفة في البرنامج. [ 13 ] على سبيل المثال، لنفترض أن دالة بحث في مصفوفة ترابطية تُطلق استثناءً إذا لم يكن للمفتاح قيمة مرتبطة به. وبحسب السياق، قد يحدث استثناء "المفتاح غير موجود" هذا بشكل متكرر أكثر من عملية البحث الناجحة. [ 15 ]

تاريخ

ظهرت أولى تطبيقات معالجة الاستثناءات في الأجهزة في جهاز UNIVAC I عام 1951. كانت عملية تجاوز السعة الحسابية تُنفذ تعليمتين عند العنوان 0، مما يسمح بنقل التحكم أو تصحيح النتيجة. [ 16 ] تطورت معالجة الاستثناءات البرمجية في الستينيات والسبعينيات من القرن العشرين، ثم اعتمدتها العديد من لغات البرمجة على نطاق واسع بدءًا من الثمانينيات.

استثناءات الأجهزة

لا يوجد إجماع واضح حول المعنى الدقيق للاستثناء فيما يتعلق بالأجهزة. [ 17 ] من وجهة نظر التنفيذ، يتم التعامل معه بشكل مطابق للمقاطعة : يوقف المعالج تنفيذ البرنامج الحالي، ويبحث عن معالج المقاطعة في جدول متجه المقاطعة لهذا الاستثناء أو حالة المقاطعة، ويحفظ الحالة، ثم يُبدّل التحكم.

استثناءات الفاصلة العائمة في معيار IEEE 754

يشير التعامل مع الاستثناءات في معيار IEEE 754 للفاصلة العائمة بشكل عام إلى الحالات الاستثنائية، ويعرّف الاستثناء بأنه "حدث يحدث عندما لا يكون لعملية ما على بعض المعاملات المحددة نتيجة مناسبة لكل تطبيق معقول. قد تشير تلك العملية إلى استثناء واحد أو أكثر عن طريق استدعاء المعالجة الافتراضية أو، إذا طُلب ذلك صراحةً، معالجة بديلة محددة في اللغة."

بشكل افتراضي، يمكن استئناف معالجة استثناء IEEE 754، ويتم التعامل معه باستبدال قيمة محددة مسبقًا للاستثناءات المختلفة، مثل اللانهاية لاستثناء القسمة على صفر، وتوفير علامات حالة للتحقق لاحقًا من حدوث الاستثناء (انظر مراجعة لغة C رقم C99 للاطلاع على مثال نموذجي لمعالجة استثناءات IEEE 754). يتضمن أسلوب معالجة الاستثناءات الذي يُفعّل باستخدام علامات الحالة ما يلي: أولًا، حساب تعبير باستخدام تطبيق سريع ومباشر؛ التحقق مما إذا كان قد فشل عن طريق اختبار علامات الحالة؛ ثم، إذا لزم الأمر، استدعاء تطبيق أبطأ وأكثر موثوقية حسابيًا. [ 18 ]

يستخدم معيار IEEE 754 مصطلح "المعالجة الاستثنائية" للإشارة إلى استدعاء روتين معالجة الاستثناءات الذي يوفره المستخدم في حالات استثنائية، وهي ميزة اختيارية في المعيار. يوصي المعيار بعدة سيناريوهات استخدام لهذه الميزة، بما في ذلك تطبيق استبدال مسبق غير افتراضي للقيمة متبوعًا باستئناف المعالجة، وذلك لمعالجة حالات التفرد القابلة للإزالة بإيجاز . [ 18 ] [ 19 ] [ 20 ]

يُجنّب سلوك معالجة الاستثناءات الافتراضي في معيار IEEE 754، والمتمثل في استئناف التنفيذ بعد استبدال القيمة الافتراضية مسبقًا، المخاطر الكامنة في تغيير مسار التحكم في البرنامج عند حدوث استثناءات عددية. فعلى سبيل المثال، انتهى إطلاق مركبة كلوستر الفضائية عام 1996 بانفجار كارثي، ويعود ذلك جزئيًا إلى سياسة معالجة الاستثناءات في لغة آدا، والتي تقضي بإيقاف العمليات الحسابية عند حدوث خطأ حسابي. ويزعم ويليام كاهان أن سلوك معالجة الاستثناءات الافتراضي في معيار IEEE 754 كان سيمنع حدوث ذلك. [ 19 ]

في لغات البرمجة

في برمجة الحاسوب ، توجد آليات متعددة في لغات البرمجة لمعالجة الاستثناءات . يُستخدم مصطلح "الاستثناء" عادةً للدلالة على بنية بيانات تخزن معلومات حول حالة استثنائية. إحدى آليات نقل التحكم، أو إطلاق الاستثناء، تُعرف باسم "الرمي "؛ ويُقال حينها إن الاستثناء قد أُطلق . ثم يُنقل التنفيذ إلى " التقاط" .

في واجهات المستخدم

أدخلت أطر تطوير واجهات المستخدم الأمامية ، مثل React و Vue ، آليات لمعالجة الأخطاء حيث تنتشر الأخطاء تصاعديًا في تسلسل مكونات واجهة المستخدم ، بطريقة مماثلة لانتشارها في مكدس الاستدعاءات أثناء تنفيذ التعليمات البرمجية. [ 21 ] [ 22 ] هنا، تعمل آلية حدود الخطأ كبديل لآلية try-catch التقليدية. وبالتالي، يضمن المكون التقاط الأخطاء من مكوناته الفرعية ومعالجتها، وعدم انتشارها إلى المكونات الأصلية.

على سبيل المثال، في Vue.js ، يمكن للمكون التقاط الأخطاء عن طريق تنفيذerrorCaptured

Vue.component('parent',{template: '<div><slot></slot></div>',errorCaptured:(err,vm,info)=>alert('An error occurred'); }) Vue.component('child',{template: '<div>{{cause_error()}}</div>' }) 

عند استخدامها بهذه الطريقة في لغة الترميز:

< parent > < child ></ child > </ parent >

يتم التقاط الخطأ الناتج عن المكون الفرعي ومعالجته بواسطة المكون الأصل. [ 23 ]

انظر أيضاً

مراجع

  1. 1 2 كريستيان، فلافيو (1980). "معالجة الاستثناءات وتحمل أعطال البرمجيات". معاملات IEEE في الحوسبة (6) (طبعة FTCS-25 المعاد طباعتها )  : 531-540 . CiteSeerX 10.1.1.116.8736 . doi : 10.1109/TC.1982.1676035 . OCLC 1029229019. S2CID 18345469 .   
  2. Goodenough 1975b ، ص 683-684.
  3. جودينوف 1975ب ، ص 684.
  4. بلاك 1982 ، ص 13-15.
  5. كيتون، كافانيس وفريزن 2001 :ArrayIndexOutOfBoundsException
  6. كيتون، كافانيس وفريزن 2001 :FileNotFoundException
  7. "رسالة خطأ غير معتادة : java.io.SyncFailedException: فشل المزامنة" . groups.google.com . تم الاطلاع عليه بتاريخ 17 نوفمبر 2023 . 
  8. "فهم استثناء OutOfMemoryError" . docs.oracle.com . تم الاطلاع عليه بتاريخ 17 نوفمبر 2023 .
  9. جافا:FileNotFoundException
  10. كينيري، جيه آر (2006). "الاستثناءات في جافا وإيفل: طرفان متناقضان في تصميم الاستثناءات وتطبيقها". مواضيع متقدمة في تقنيات معالجة الاستثناءات (ملف PDF) . سلسلة محاضرات في علوم الحاسوب. المجلد 4119. الصفحات 288-300 . doi : 10.1007/11818502_16 . ISBN   978-3-540-37443-5. S2CID 33283674 . 
  11. 1 2 لانغ، جون؛ ستيوارت، ديفيد ب. (مارس 1998). "دراسة حول مدى قابلية تطبيق تقنيات معالجة الاستثناءات الحالية على تكنولوجيا البرمجيات في الوقت الحقيقي القائمة على المكونات". معاملات ACM في لغات البرمجة والأنظمة . 20 (2): 276. CiteSeerX 10.1.1.33.3400 . doi : 10.1145/276393.276395 . S2CID 18875882. ربما يكون الشكل الأكثر شيوعًا لطريقة معالجة الاستثناءات التي يستخدمها مبرمجو البرمجيات هو تقنية "رمز الإرجاع" التي شاعت كجزء من لغة C ونظام UNIX.  
  12. ليفين 1977 ، ص 5.
  13. 1 2 ليسكوف، ب.هـ؛ سنايدر، أ. (نوفمبر 1979). "معالجة الاستثناءات في لغة CLU" (ملف PDF) . معاملات IEEE في هندسة البرمجيات . SE-5 (6): 546-558 . Bibcode : 1979ITSEn...5..546L . doi : 10.1109/TSE.1979.230191 . S2CID 15506879. تاريخ الاسترجاع: 19 ديسمبر 2021 . 
  14. "نتائج البحث في قاموس المرادفات لكلمة EXCEPTION" . www.merriam-webster.com . تاريخ الاسترجاع: 17 نوفمبر 2023 .
  15. ليفين 1977 ، ص 4.
  16. سموثرمان، مارك. "مقاطعات" . تم الاسترجاع في 4 يناير 2022 .
  17. هايد، راندال. "فن التجميع: الفصل السابع عشر" . www.plantation-productions.com . تم الاطلاع عليه بتاريخ 22 ديسمبر 2021 .
  18. 1 2 شياوي لي ؛ جيمس ديميل (1994). "خوارزميات عددية أسرع عبر معالجة الاستثناءات، معاملات IEEE على أجهزة الكمبيوتر، 43 (8)): 983-992 .{{cite journal}}يتطلب الاستشهاد بالمجلة ( مساعدة )|journal=
  19. 1 2 دبليو. كاهان (5 يوليو 2005). "عرض توضيحي للاستبدال المسبق لـ ∞/∞" (ملف PDF) . مؤرشف (ملف PDF) من الأصل في 10 مارس 2012.
  20. هاوزر، جون ر. (مارس 1996). "معالجة استثناءات الفاصلة العائمة في البرامج العددية" . معاملات ACM في لغات البرمجة والأنظمة . 18 (2): 139-174 . doi : 10.1145/227699.227701 . S2CID 9820157 . 
  21. "حدود الخطأ" . React . تم الاسترجاع في 10-12-2018 .
  22. "واجهة برمجة تطبيقات Vue.js" . Vue.js. تم الاطلاع عليه بتاريخ 10-12-2018 .
  23. "معالجة الأخطاء باستخدام Vue.js" . CatchJS . تم الاطلاع عليه بتاريخ 10 ديسمبر 2018 .