معالجة الأستثناءات
عملية التنقيح Debugging هي عملية وضع البرنامج تحت الإختبار قبل أن ينزل السوق .. ولو حصل في البرنامج خطأ ما.. فإنه سيظهر مباشرة للمستخدم والمستخدم سيرسل لفريق التطوير بنوع الخطأ الحاصل، وهم بدورهم سيعالجوا الخطأ في شفرة المصدرية للبرنامج وبعدها يقوموا باختبار البرنامج مرة أخرى و إنزاله في السوق وهكذا ..
توجد تقنية أخرى منتشرة تسمى معالجة الاستثاءات Exceptions بحيث تقوم بمعالجة الخطأ وإظهار رسالة واضحة للمستخدم بطريقة مفهومة .. مثلا عملية القسمة على صفر غير منطقية بالمرة أليس كذلك ؟
جرب أن تنفذ الكود التالي:
ستجد التالي:
divided by 0 (ZeroDivisionError)
فكيف سنتحكم بهذه العملية؟
الحل هو بإستخدام begin/rescue/end
الصورة العامة
begin
#your normal code goes here.
#error!
rescue
#rescue code
ensure
#always happen!
end
begin
puts 1/0
rescue ZeroDivisionError
puts "Never studied math, you genius? You are dividing by zero!"
exit(1) #terminate
end
سنقوم بمعالجة المشكلة فى rescue او (catch/except block) بإن نظهر رسالة التالية:
"Never studied math, you genius? You are dividing by zero!"
ونخرج من البرنامج بإستخدام exit
جميل ، الآن أتى وقت ensure (ال finally)
ensure كتلها يجب أن تنفذ!
begin
puts 1/0
rescue ZeroDivisionError
puts "Never studied math, you genius? You are dividing by zero!"
exit(1) #terminate
ensure
puts "This is always appeared!"
end
إذا سأل شخص ما وجه الإستفادة من ensure ؟
ensure تستطيع أن تستخدمها فى قفل مصدر المفتوح مثلا ملف او اتصال وهكذا
جميل، تستطيع أن تفصل Exceptions على مزاجك

مثال تطبيقى:
على فرض أن الطفل سمع دق الجرس ، وهو لا يعرف من القادم، فكيف سيتعامل مع الموقف؟
سنجعله يظهر معرفه id وإلا سيقفل الباب و يطلب الشرطة، أليس كذلك؟
الأول سنعمل Error مخصوص ليعبر عن مشكلتنا وهى أن شخصا غريبا دق الجرس
class IntruderKnocksError < StandardError
end
بعد هذا ، سنضع كودنا:
begin
door_closed=false
who="intruder"
if who=="intruder"
raise IntruderKnocksError, "Can't open for intruders."
end
rescue IntruderKnocksError => e
puts e.message #Error message
p e.backtrace #backtrace! ( Where was the exception raised )
puts "show me some id.. [y/n]: "
ans=gets.chomp!.downcase
if ans=='y'
who="known"
puts "hi, i know you!"
else
puts "you wanna kidnap me? calling police.."
exit 1
end
ensure
door_closed=true
end
فى العالم الحقيقى بنستخدم الإستثناءات وال unittesting بصورة كبيرة لإختبار كل اهداف البرنامج