Ruby / العقود: الاستدعاء والتقييم والإخفاق ونماذج القيم / الدرس 9
ترجمة الاستثناءات دون إخفاء الإخفاق
استخدم rescue ضيقة ورفضا صريحا وأسبابا محفوظة وتنظيف ensure، مع تمييز النجاح من البديل.
في هذه الصفحة
أهداف الدرس
- اشرح حد StandardError في rescue العادية ولماذا يضلل الالتقاط الواسع لـ Exception غالبا.
- احفظ النتيجة أو الفشل المقصودين عبر التنظيف وترجمة الخطأ.
يحتاج الرفض المتوقع والعيب معالجتين مختلفتين
قد يكون المدخل المشوه نتيجة تحقق عادية، وقد يشير خرق افتراض داخلي إلى سوء استخدام الواجهة من المستدعي أوإلى عيب برمجي. اختر العقد قبل صياغة rescue. لا تعلن الطرق قوائم استثناءات مفحوصة، فتحتاج الإخفاقات المهمة توثيقا واختبارات مركزة. تلتقط rescue غير المؤهلة أبناء StandardError لا كل Exception. وقد يعترض الالتقاط الواسع إشارات كالانقطاع والخروج لا ينبغي تحويلها لنجاح فارغ. عالج ما يفهمه الحد واحفظ الباقي.
التقط فشل التحويل عند حده
ترمي Integer على النص الخاطئ ArgumentError. يحصر المثال العملية في begin/rescue صغيرة برسالة رفض ثابتة. قد تسمي كتلة كبيرة تضم التحويل والتخزين والعرض ArgumentError أخرى نصا مشوها. وقد تخفي صيغة expression rescue nil الغموض نفسه باختصار. فضّل حدودا صريحة عندما يكون للفشل معنى. تعرض علامة ensure سلوك الخروج العادي فقط؛ ولا يقتنى مورد حقيقي ولم ينفذ مفسر السكربت.
begin
value = Integer('bad', 10)
puts value
rescue ArgumentError
puts 'invalid quantity'
ensure
puts 'conversion finished'
end
invalid quantity
conversion finished
المخرج المتوقع invalid quantity ثم conversion finished. لا تطبع قيمة محولة صحيحة. المصدر غير منفذ ولا يغلق موردا حقيقيا.
احفظ معنى التشخيص الأصلي
تعيد raise بلا معاملات داخل rescue رمي الاستثناء الجاري. عند الترجمة لصنف StandardError تطبيقي احفظ السبب والسياق الآمن ولا تخترع نجاحا غير مرتبط. تدعم Ruby سلاسل الأسباب؛ فافحصها ولا تهدر الأصل. تجنب الاعتمادات والسجلات الشخصية والمدخل الكامل غير المحدود في الرسائل. يجب أن تعكس نتائج الغياب والخطأ وعدم الإتاحة والفشل الأدلة الفعلية. لا يثبت الالتقاط عكس أثر جزئي أو أمان الإعادة، بل تشغيل المعالج فقط.
تحفظ ensure نتيجة الجسم عادة
تعمل ensure عند مغادرة النطاق ضمن معالجة الاستثناء العادية. لا يستبدل تعبيرها الأخير الطبيعي نتيجة الجسم، لكن return صريحة أو استثناء جديدا فيها قد يحجبان السابق. يعيد المساعد العدد الناتج من الكتلة مع علامة تنظيف. هذا نموذج تحكم لا تحقق مورد. قد يفشل التنظيف الحقيقي ويحتاج مالكا وسياسة لحفظ الإخفاق الأولي المهم. لا يضمن الإنهاء المفاجئ للعملية اكتمال كل ensure.
def with_notice
value = yield
value
ensure
puts 'cleanup marker'
end
puts with_notice { 7 }
cleanup marker
7
المخرج المتوقع cleanup marker ثم 7. لا تستبدل طباعة ensure نتيجة الجسم. لا يوجد ملف أو خدمة أو مفسر منفذ.
تحقق من الحالة بعد الفشل لا عدد الالتقاطات
يفحص التحقق نتيجة المستدعي والقيد والموارد والآثار المنجزة. تتبع الإعادة هوية العملية وأمان تكرارها، خاصة إذا ثبّت مزود قبل إبلاغ الخطأ. افصل التحقق المتوقع من التعطل والعيب الداخلي. افحص النجاح والرفض المعلن والفشل غير المتوقع والتنظيف معزولا، وسجّل المفسر والمدخل والنتائج الفعلية. تصف الدورة الخطة والأمثلة المحللة فقط، ولا تنفذ استثناءات Ruby أو تراجعا أو استعادة.
الأخطاء الشائعة وإصلاحها
يتحول تعطل إلى نتيجة ناجحة فارغة.
- لماذا يحدث؟
- دمجت rescue واسعة معاني فشل مختلفة في بديل واحد.
- كيف تصلحه؟
- ترجم الفشل المفهوم واحفظ عدم الإتاحة أو الإخفاق صراحة.
- كيف تتجنب تكراره؟
- حدّد المعنى التجاري لكل بديل قبل تنفيذه.
تحجب return في ensure الاستثناء الأصلي.
- لماذا يحدث؟
- غيّر التنظيف نتيجة التدفق المحمي.
- كيف تصلحه؟
- أزل return واجعل التنظيف محدودا قابلا للملاحظة.
- كيف تتجنب تكراره؟
- راجع التنظيف في النجاح والفشل.
تمنع rescue Exception عامة سلوك خروج مقصودا.
- لماذا يحدث؟
- تجاوز المعالج إخفاقات StandardError التطبيقية العادية.
- كيف تصلحه؟
- ضيّق الصنف والنطاق وفق العقد المعالج.
- كيف تتجنب تكراره؟
- افصل الانقطاع وعمر العملية عن تحقق المدخل.
اختبر فهمك
1. لماذا تلتبس begin حول استيراد كبير تتبعها rescue ArgumentError؟
اعرض الحل المشروح
قد ترفع عمليات كثيرة داخل الاستيراد الصنف نفسه لأسباب مختلفة، منها سوء استخدام برمجي داخلي، فيلوم المعالج تحويل المدخل خطأ. ضيّق النطاق المحمي حول التحويل، أوترجم الإخفاقات في الطبقة التي تفهمها، ثم احتفظ بمسار مستقل للعيوب غير المتوقعة. ولا يُعد تطابق صنف الاستثناء وحده تشخيصاً للسبب الجذري.
2. هل تثبت علامة ensure التراجع عن كتابة خارجية فاشلة؟
اعرض الحل المشروح
لا. تثبت وصول التنظيف المحلي للعبارة فقط. قد يكتمل الأثر الخارجي أو جزء منه، وقد يفشل التنظيف. افحص الحالة المرجعية وعقد الاستعادة قبل الإعادة. لا ينشئ المعالج المحلي ضمان تراجع موزع.
أهم ما تعلمته
- يجب أن يتفق صنف الاستثناء والنطاق المحمي ومعنى البديل.
- ينبغي أن يحفظ التنظيف صدق النتائج وأسباب الفشل المفيدة.