التعامل مع الاستثناءات
| English | العربية |
|---|---|
| exception/ekˈsepʃn/ | استثناء |
| exception handling/ekˈsepʃn ˈhændlɪŋ/ | معالجة الاستثناءات |
| raise/reɪz/ | يرفع |
التحقق الذي لا يمكن كتابته
- يفتح برنامج ملفًا. قبل فتحه، يمكنك التحقق من وجود الملف، وقابليته للقراءة، ووجود القرص. افترض أن كل التحقق اجتاز بنجاح.
- بين آخر تحقق وفتح الملف، يسحب المستخدم قطعة USB. كان الملف موجودًا عندما سألت عنه ولا يوجد عند فتحه، ولا يمكن لأي قدر من التحقق المسبق سد هذه الفجوة.
- بعض الأخطاء ببساطة غير قابلة للوقاية، لأن العالم يتغير بين الاختبار والعملية. ما يمكن للبرنامج فعله هو الاستجابة لها عند وقوعها.
- هذا الدرس هو الاستثناء، وهيكلية TRY التي تتعامل مع واحد، وأين في البرنامج يجب捕获 الاستثناء.
ما هو الاستثناء ولماذا يجب التعامل معه
- الاستثناء هو خطأ يحدث أثناء التنفيذ: القسمة على صفر، ملف غير موجود، إدخال غير صالح، شبكة تم قطعها.
- التعامل مع الاستثناءات يسمح للبرنامج باكتشاف الخطأ والاستجابة بطريقة منتظمة، بدلاً من انهياره وفقدان عمل المستخدم.
- البرامج الحقيقية تواجه أخطاء لا يمكن منعها مسبقًا، كما يظهر الخطاف. وبدون الاستثناءات، ستحتاج كل عملية على حدة إلى فحص
IFخاص بها، مما يخبئ الخوارزمية الفعلية تحت فحوصات الأخطاء. - الفائدة الثالثة هي التي يطرحها الامتحان أكثر من غيرها: أنها تفصل التدفق الطبيعي عن معالجة الأخطاء، بحيث تكون المسار الرئيسي نظيفًا للقراءة.
الاستثناء هو:
الاستثناءات هي مشاكل وقت التشغيل (القسمة على صفر، ملف غير موجود) التي يسمح التعامل معها بالاستجابة لها بشكل لائق.
لماذا تستخدم معالجة الاستثناءات بدلاً من التحقق من كل خطأ مسبقاً؟ حدد جميع الخيارات الصحيحة.
الفوائد هي الدقة والوضوح. السرعة ليست من ضمنها؛毕竟 المعالجة تضيف بعض التكلفة الإضافية، وهي تستحق الدفع.
هيكلة TRY
TRY
OPENFILE "data.txt" FOR READ
READFILE "data.txt", line
CLOSEFILE "data.txt"
EXCEPT FileNotFound
OUTPUT "Sorry, the file does not exist."
EXCEPT ReadError
OUTPUT "Sorry, there was an error reading the file."
FINALLY
OUTPUT "Finished attempting to read."
ENDTRY
- يحتوي كتلة TRY على الكود الذي قد يفشل. إذا تم تشغيله دون أخطاء، يتم تخطي كتل EXCEPT تمامًا.
- عند حدوث استثناء، ينتقل التنفيذ فورًا إلى أول كتلة EXCEPT مطابقة. لا يتم تنفيذ باقي كتلة TRY بشكل.
- تُنفذ كتلة FINALLY سواء حدث استثناء أم لم يحدث، مما يجعلها المكان المناسب للتنظيف مثل إغلاق ملف.

مسار واحد عندما كل شيء على ما يرام، وآخر عندما لا يكون كذلك، ومسار يعمل دائمًا
كيف يتدفق التعامل مع الاستثناءات
مرر عبر ما يحدث عند فشل الكود. يقفز الاستثناء خارج التدفق الطبيعي إلى معالج، ينظف FINALLY في الحالتين، ويستمر البرنامج بدلاً من انهياره.
طابق كل كلمة مفتاحية لمعالجة الاستثناءات مع وظيفتها.
TRY تحمي الكود الخطر، EXCEPT تلتقط الاستثناء، FINALLY ينظف في كلتا الحالتين، RAISE يرمي خطأ ليتم التقاطه.
كتلة FINALLY:
FINALLY تُنفَّذ دائماً، مما يجعلها مثالية للتنظيف مثل إغلاق الملفات.
الكتلة التي تُنفَّذ سواء حدث استثناء أم لا، مما يجعلها مناسبة لإغلاق الملفات، هي ____.
يجب أن يحدث التنظيف في كلا المسارين. وضع CLOSEFILE فقط في كتلة TRY يعني أنه سيتم تخطيه تماماً عندما يترك خطأ الملف مفتوحاً.
مثال محلول: تتبع التدفق
- في الكود أعلاه، الملف غير موجود. اذكر بدقة ما سيتم إخراجه وما سيتم تخطيه.
OPENFILEيُثير FileNotFound، لذلك يغادر التنفيذ كتلة TRY فورًا: لن يتم تنفيذ الأسطرREADFILEوCLOSEFILEأبدًا.- تُنفذ كتلة EXCEPT
FileNotFound، وتُخرج "Sorry, the file does not exist." لا تُنفذ كتلةReadError، لأنه يتم استخدام معالج المطابقة الأول فقط. - تُنفذ كتلة FINALLY، وتُخرج "Finished attempting to read."
- العلامة الأكثر فقدانًا هي ملاحظة أن باقي كتلة TRY يتم التخلي عنها.
الملف في كتلة TRY غير موجود. رتب ما يحدث بالترتيب.
يتنفَّذ المعالج المطابق الأول فقط، وتُنفَّذ FINALLY في كلتا الحالتين. الجزء المتبقي من كتلة TRY الذي تم تخطيه هو العلامة الأكثر إهمالاً غالباً.
إثارة الاستثناء
- يمكن للجزء الفرعي الذي يكتشف مشكلة لا يستطيع التعامل معها بشكل معقول أن يُثير استثناءً، وينقل المسؤولية إلى من استدعاه:
IF b = 0 THEN RAISE DivideByZero
- هذا هو التصميم الصحيح عندما يعرف الجزء الفرعي أن هناك خطأ لكن لا يعرف ما يجب فعله. معرفة routine القسمة أن المقسوم عليه صفر؛ فقط المستدعي يعرف ما إذا كان يجب طلب الأمر من المستخدم مرة أخرى، أو استخدام افتراضي، أو التخلي عن الحساب.
تستخدم الدالة الفرعية RAISE لـ:
RAISE يرمي استثناءً إلى المُنشئ، والذي يمكنه التقاطه باستخدام EXCEPT.
لماذا قد ترفع دالة القسمة استثناءً بدلاً من معالجة المقسوم عليه الصفري بنفسها؟
اطلب من المستخدم مرة أخرى، استخدم افتراضياً، أو اترك الحساب: فقط كود الاستدعاء يمتلك السياق للاختيار.
أين يتم التعامل معه
- تعامل مع الاستثناء قريبًا من مكان حدوثه عندما تكون الاستجابة بسيطة ومحلية: طباعة رسالة، استخدام افتراضي، طلب من المستخدم المحاولة مجددًا.
- تعامل معه على مستوى أعلى عندما يتعلق القرار بجزء أكبر من البرنامج: ما إذا كان يجب التخلي عن عملية كاملة، أو التراجع عن تغيير، أو إخبار المستخدم بفشل العملية.
- القاعدة العامة: التقطه على المستوى الذي يحتوي على معلومات كافية لقرارة ما يجب فعله، وليس على المستوى الذي يلاحظه لأول مرة.
مثال محلول: ما لا يجب فعله
- كتب طالب
EXCEPT: (do nothing)حول برنامج كامل حتى لا يتوقف أبدًا. اشرح لماذا يعتبر هذا ممارسة سيئة. - يتم ابتلاع الاستثناء: يستمر البرنامج وكأنه لم يحدث شيء خاطئ، لذا يستمر مع بيانات مفقودة أو غير صالحة وينتج نتائج خاطئة بدلاً من فشل واضح.
- الفشل الصامت أصعب في التشخيص من التوقف، لأنه لا توجد رسالة ولا أي indication لحدوثه.
- التقاط كل استثناء في مكان واحد يعني أيضًا ضياع نوع الخطأ المحدد، لذا لا يمكن اختيار استجابة منطقية. يجب أن يلتقط المعالج استثناءً محددًا ويستجيب له فعليًا.
امتصاص الاستثناء بصمت "swallowing" (التقاطه دون فعل شيء) يخفي الأخطاء الحقيقية ويجعل تصحيح الأخطاء صعباً — يجب معالجته أو على الأقل تسجيله.
المعالج الفارغ يخفي المشاكل التي تحتاج إلى العثور عليها؛ استجب دائماً أو سجل الخطأ.
علامات ضائعة
- عند حدوث استثناء، يتم تخطي باقي كتلة TRY. قل ذلك عند التتبع.
- تُنفذ فقط المطابقة الأولى من EXCEPT، وليست جميعها.
- تعمل كتلة FINALLY دائمًا، سواء حدث خطأ أم لم يحدث، وهو ما يجعلها مناسبة لإغلاق الملفات.
- لا تقم بالتقاط استثناء وعدم فعل شيء. الخطأ المبتلع أسوأ من التوقف، لأن البرنامج يستمر ببيانات خاطئة.
لقد فهمت الأمر
- الـ استثناء هو خطأ وقت التشغيل؛ التعامل معه يسمح للبرنامج بالاستجابة بدلاً من التوقف، ويغطي الأخطاء التي لا يمكن منعها مسبقًا، ويفصل بين الكود العادي والتعامل مع الأخطاء
- كتلة TRY تحتوي على الكود المحفوف بالمخاطر؛ عند الخطأ يتم تخطي باقيها وتُنفذ أول كتلة EXCEPT مطابقة؛ كتلة FINALLY تعمل في كلا الحالتين، لذا ينتمي التنظيف إليها
- الجزء الفرعي الذي لا يمكنه قرار الاستجابة يجب أن يُثير الاستثناء لمندعه
- تعامل معه قريبًا لاستجابة محلية بسيطة، وعلى مستوى أعلى عندما يتطلب القرار نظرة أوسع؛ لا تقم بالتقاطه أبدًا وعدم فعل شيء