يتعامل Ruby مع الأخطاء باستخدام begin/rescue/ (ما يعادل try/catch/finally في Ruby). تقوم برفع الاستثناءات باستخدام وتتعاملها باستخدام ، مع استخدام للتنظيف. يسمح Ruby أيضاً بـ rescue على مستوى الدالة (بدون صريح) للحصول على كود أنظف.
يتعامل Ruby مع الأخطاء باستخدام begin/rescue/ (ما يعادل try/catch/finally في Ruby). تقوم برفع الاستثناءات باستخدام وتتعاملها باستخدام ، مع استخدام للتنظيف. يسمح Ruby أيضاً بـ rescue على مستوى الدالة (بدون صريح) للحصول على كود أنظف.
ensureraiserescueensurebeginbegin
result = risky_operation
rescue ArgumentError => e # rescue a SPECIFIC exception type
puts "Bad argument: #{e.message}"
rescue StandardError => e # broader catch (StandardError, not Exception)
puts "Error: #{e.message}"
retry if attempts < 3 # retry can re-run the begin block
else
puts "succeeded" # runs if NO exception
ensure
cleanup # ALWAYS runs (success or failure)
end
begin/rescue/ensure هو معادل Ruby لـ try/catch/finally. أمسك بأنواع معينة من الاستثناءات (rescue ArgumentError)، استخدم ensure لتنظيف مضمون، و else للحالة التي لا يوجد فيها خطأ. يمكن لـ retry أن يعيد محاولة الكتلة.
rescue => e # ✅ bare rescue catches StandardError (the right default)
rescue StandardError # ✅ explicit, same thing
rescue Exception # ❌ AVOID — catches EVERYTHING including system signals
# (Interrupt/Ctrl-C, SystemExit) — can break the program
مهم: rescue بدون تحديد يمسك بـ StandardError (وهو الافتراضي الصحيح لأخطاء التطبيق). الإمساك بـ Exception (الجذر) يمسك بـ كل شيء، بما في ذلك إشارات على مستوى النظام مثل Interrupt (Ctrl-C) و SystemExit — وهذا ما لا تريده عادة، لأنه يمكن أن يمنع البرنامج من الانقطاع أو الخروج بشكل صحيح. وهذا خطأ شائع في Ruby.
raise ArgumentError, "Amount must be positive" # raise a built-in
raise "Something failed" # raises RuntimeError
# custom exception class
class InsufficientFundsError < StandardError # inherit from StandardError
def initialize(msg = "Not enough funds")
super
end
end
raise InsufficientFundsError
def process
do_work
rescue => e # rescue WITHOUT begin — applies to the whole method body
handle(e)
ensure
cleanup
end
معالجة الاستثناءات بشكل صحيح أمر حتمي لتطبيقات Ruby قوية، وفهم نهج Ruby — بما في ذلك الأساليب المميزة الخاصة به — مهم.
هيكل begin/rescue/ensure (معادل Ruby لـ try/catch/finally)، الإمساك بـ أنواع استثناءات محددة، استخدام ensure لتنظيف مضمون، و rescue على مستوى الدالة النظيف (بدون begin صريح) هي معرفة أساسية يومية.
النقطة المهمة بشكل خاص والمميزة لـ Ruby هي التمييز بين StandardError و Exception: rescue بدون تحديد (والافتراضي الصحيح) يمسك بـ StandardError، لكن الإمساك بـ Exception (جذر الهرمية) يمسك بـ كل شيء — بما في ذلك إشارات النظام مثل Interrupt (Ctrl-C) و SystemExit — وهذا تقريباً ما لا تريده أبداً، لأنه يمكن أن يمنع البرنامج من الانقطاع أو الخروج بشكل صحيح، وهذا خطأ شائع وضار.
فهم أنه يجب عليك الإمساك بـ StandardError (وليس Exception) لأخطاء التطبيق معرفة مهمة ومحددة لـ Ruby تمنع الأخطاء الحقيقية.
معرفة الهيكل، وفئات الاستثناءات المخصصة (التي ترث من StandardError)، و retry، وأسلوب rescue على مستوى الدالة، وخاصة تحذير StandardError-not-Exception مهم لكتابة Ruby قوية وصحيحة تتعامل مع الأخطاء برشاقة بدون كسر قدرة البرنامج على الانقطاع.
لأن الأخطاء غير المعالجة وخطأ Exception-rescuing يسبب كلاهما مشاكل حقيقية، فإن إتقان معالجة الاستثناءات في Ruby — هيكلها والأساليب والتمييز الحرج بين StandardError و Exception — معرفة مهمة وذات صلة متكررة لتطوير Ruby موثوق وموضوع مقابلة شائع.