begin / rescue
جزء من قسم المنطق وتدفق العمليات في رحلة Ruby على Coddy — الدرس 44 من 56.
لمنع استثناء من التسبب في تعطل برنامجك، قم بتغليف الكود المحفوف بالمخاطر في begin ... rescue ... end. إذا حدث أي خطأ داخل begin، ينتقل Ruby إلى كتلة rescue المطابقة بدلاً من الإجهاض.
begin
result = 10 / 0
puts result
rescue ZeroDivisionError
puts "Cannot divide by zero!"
end
# لا يمكن القسمة على صفر!يمكنك الحصول على كائن الاستثناء نفسه باستخدام => e وقراءة .message الخاصة به:
begin
Integer("hello")
rescue ArgumentError => e
puts "Bad input: #{e.message}"
end
# Bad input: invalid value for Integer(): "hello"إذا لم تقم بتسمية فئة استثناء، فإن rescue بمفردها تلتقط StandardError وفروعها، وهي معظم الإخفاقات اليومية. يكون الالتقاط أكثر فائدة عندما يمكنك القيام بشيء ما في كتلة rescue: استبدال قيمة افتراضية، أو تسجيل المشكلة، أو سؤال المستخدم مرة أخرى.
التحدي
سهلاقرأ سطرين من المدخلات، يجب أن يكون كلاهما أعداداً صحيحة، لكن السطر الثاني قد لا يكون رقماً صالحاً.
قم بلف عملية تحليل السطر الثاني داخل begin / rescue:
- استخدم
Integer(input)(الذي يثيرArgumentErrorعند وجود سلسلة نصية خاطئة) - إذا نجح التحليل، اطبع
Sum: <a + b> - إذا فشل، اطبع
Bad number!
للمدخلات 3 ثم 4، المخرجات هي Sum: 7. للمدخلات 3 ثم abc، تكون Bad number!.
ورقة مرجعية
استخدم begin ... rescue ... end لمعالجة الاستثناءات دون توقف البرنامج:
begin
result = 10 / 0
rescue ZeroDivisionError
puts "Cannot divide by zero!"
endالتقط كائن الاستثناء باستخدام => e للوصول إلى رسالته:
begin
Integer("hello")
rescue ArgumentError => e
puts "Bad input: #{e.message}"
endاستخدام rescue بدون تحديد فئة يلتقط StandardError وفئاته الفرعية.
جرّب بنفسك
a = gets.to_i
raw_b = gets.chomp
# مهمة: استخدم begin/rescue حول Integer(raw_b)؛ اطبع المجموع أو "Bad number!"
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق العمليات
1السلاسل النصية بعمق
نظرة عامة على دوال السلاسل النصيةتضمين النصوص (String Interpolation)التكرار عبر السلاسل النصيةالتقسيم والربط (Split و Join)مراجعة - نساج النصوص4Blocks و Procs و Lambdas
ما هو الـ Block؟do..end مقابل الأقواس { }الكلمة المفتاحية yieldمعاملات الـ BlockProcs و Lambdasمراجعة - Custom Iterator مخصص7Hashes - الجزء الثاني
Hash.new مع القيم الافتراضيةالتكرار عبر الـ Hashesالـ Hashes المتداخلةالدمج والتحويلمراجعة - عداد التكرار10مشروع - سجلات الطلاب
نظرة عامة على المشروعإضافة طالب5قوة الـ Enumerable
Select و Rejectتسلسل MapReduce / Injectcount، all?، any?، none?group_by و partitionsort_by، min_by، max_byمراجعة - Data Pipeline