سؤال

كنت ذاهبا من خلال البرمجة روبي الكتاب و أنا أعاني من مشاكل في فهم المفاهيم التالية:

  1. يتحدث الكتاب عن "عابرة الاستثناءات" التي قد تحدث في التعليمات البرمجية ثم أقترح إنشاء الخاصة بك استثناء كائن التعامل معها.أنا لا أعتقد أنني أفهم تماما ما خطأ عابر و متى يكون من المناسب أن تجعل الخاصة بك وجوه استثناء.يتحدث عن ذلك في الفصل 6 عندما يتحدث عن تحديد الاستثناءات:

على سبيل المثال, أنواع معينة من الشبكة أخطاء قد تكون عابرة.الفصل 6.صفحة 97.إضافة معلومات إلى الاستثناءات.

  1. أنا أيضا أواجه صعوبة في الحصول على جميع أنحاء الاستخدام من التقاط ورمي في روبي.عندما هو أفضل من رفع والإنقاذ ؟
هل كانت مفيدة؟

المحلول

هل يمكنك أن تعطينا صفحة الإشارة إلى "عابر الاستثناءات" الخط ؟

في أي حال, يمكنك إنشاء جديد استثناء أي وقت, و هو عادة جيدة للقيام بذلك بحيث يمكنك نقل المزيد من المعلومات حول خطأ.هذا هو جيد وخاصة عندما يكون لديك alow مستوى استثناء و تريد أن تجعل في شيء أكثر فائدة للمستخدم.

رمي/الصيد في روبي هي في الحقيقة نوع من غير محلي غوتو ، مثل setjmp/longjmp في C ، ولكن أفضل تصرف.كنت استخدامه في أي وقت تريد نقل تنفيذ طرق طويلة.

ومن الواضح لنفس السبب كنت لا تريد استخدام goto كثيرا كنت لا تريد أن تفعل هذا.سبب كبير قد تستخدم في حالة من البرنامج الذي يحتاج إلى البقاء قيد التشغيل ، حتى إذا قبض بعض أنواع الأخطاء ، قد تخلص من قطعة كاملة من العمل الذي تقوم به و العودة إلى البداية.


حسنا, لا يبدو أن يكون في الصفحة 97 من أي من الطبعات معول الكتاب عندي ولكن لا أرى ما يعنيه....ها هو صفحة 157 في الطبعة الثالثة.

أولا وقبل كل شيء ، على عمل حول "عابرة" ، هناك بعض مشاكل في شبكة الاتصال التي يمكن أن تحدث ، ومن ثم حل أنفسهم ، يقول عندما BOFH ويفصل شبكة الكابلات والمقابس في العودة.حتى في ظل بعض الظروف ، قد تريد أن تعطيه بضع ثوان ليستقر وحاول مرة أخرى قبل هلع.كيف يمكنك أن تفعل ذلك ؟

في هذه الحالة لديهم يمكنك تحديد نوع جديد من استثناء.هذا يتم فقط مع الميراث:

class RetryException < RuntimeError
  # so this is a kind of RuntimeError which is a kind of Exception
  attr: ok_to_retry
  def initialize(ok_to_retry)
     @ok_to_retry
  end
end

إذن إذا كان هناك شيء يذهب على نحو خاطئ ، يمكنك رفع على هذه retryable استثناءات

raise RetryException.new(true), "transient read error"

وهو يرسل الآن ما هو نوع من RuntimeError أعلى المكدس ، ولكن الآن لديه معلومات إضافية ملحقة به ، أي العلم الذي يقول "نعم ، يمكن أن يكون هذا محاكمته."

الآن هنا حقا أنيق شيء في روبي:وقد بنيت في إمكانية إعادة محاولة بعض الأشياء.حتى في مكان أعلى المكدس ، لديك هذا الكود:

begin
   # do something that raises this exception
   do_something()
rescue RetryException => detail 
   # if the exception is one of these retryable ones, 
   # catch it here, but it in detail
   if detail.ok_to_retry  
      retry
   end
   # this means exactly the same as 'retry if detail.ok_to_retry`
   # from the book, btw

   # if it STILL doesn't work, send the exception on
   raise # just re-raises the last exception
end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top