Author Topic: Exceptions  (Read 613 times)

Ahmed Youssef

  • Helping Freak
  • Administrator
  • Active Member
  • *****
  • Posts: 242
    • View Profile
    • WWW
    • Email
Exceptions
« on: October 26, 2008, 05:34:09 PM »
معالجة الأستثناءات

عملية التنقيح Debugging هي عملية وضع البرنامج تحت الإختبار  قبل أن ينزل السوق .. ولو حصل في البرنامج خطأ ما.. فإنه سيظهر مباشرة للمستخدم والمستخدم سيرسل لفريق التطوير بنوع الخطأ الحاصل، وهم بدورهم سيعالجوا الخطأ في شفرة المصدرية للبرنامج وبعدها يقوموا باختبار البرنامج مرة أخرى و إنزاله في السوق وهكذا ..
توجد تقنية أخرى منتشرة تسمى معالجة الاستثاءات  Exceptions بحيث تقوم بمعالجة الخطأ وإظهار رسالة واضحة للمستخدم بطريقة مفهومة .. مثلا عملية القسمة على صفر غير منطقية بالمرة أليس كذلك ؟
جرب أن تنفذ الكود التالي:
Code: [Select]
puts 1/0

ستجد التالي:
Code: [Select]
divided by 0 (ZeroDivisionError)

فكيف سنتحكم بهذه العملية؟
الحل هو بإستخدام begin/rescue/end

الصورة العامة
Code: [Select]
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) بإن نظهر رسالة التالية:
Code: [Select]
 "Never studied math, you genius? You are dividing by zero!"

ونخرج من البرنامج بإستخدام exit

جميل ، الآن أتى وقت ensure (ال finally)
ensure كتلها يجب أن تنفذ!
Code: [Select]
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 على مزاجك :D

مثال تطبيقى:
على فرض أن الطفل سمع دق الجرس ، وهو لا يعرف من القادم، فكيف سيتعامل مع الموقف؟
سنجعله يظهر معرفه id وإلا سيقفل الباب و يطلب الشرطة، أليس كذلك؟
الأول سنعمل Error مخصوص ليعبر عن مشكلتنا وهى أن شخصا غريبا دق الجرس
Code: [Select]
class IntruderKnocksError < StandardError
 
end


بعد هذا ، سنضع كودنا:
Code: [Select]
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 بصورة كبيرة لإختبار كل اهداف البرنامج

Logged

Life is just a chance to grow a soul. - A. Powell
Weblog: http://ahmedyoussef.wordpress.com/