توفّر الاستثناءات في Ruby، كما في لغات كثيرة، وسيلة للتعامل مع الأحداث غير المتوقعة. والتعامل السليم مع الاستثناءات مهم عندما تحاول منع برنامجك من الانهيار.
عندما يُطرح استثناء، سواء بطرحه صراحةً أو بطرح مفسّر Ruby له، يُحوّل البرنامج مسار تشغيله الطبيعي وينتهي في النهاية برسالة خطأ:
raise ArgumentError.new("Something went wrong!")
=> Traceback (most recent call last):
.
.
ArgumentError (Something went wrong!)
1/0
=> Traceback (most recent call last):
.
.
ZeroDivisionError (divided by 0)
وإذا أردنا إيقاف عملية الإنهاء هذه، فعلينا أن نتفاعل مع الاستثناء. وهذا ما يسمى «إنقاذ» الاستثناء:
begin
# ...any code that raises an exception
rescue
puts 'Got an exception'
end
لن ينهار هذا البرنامج، وسيطبع "Got an exception". فبدلًا من الخروج، ينفّذ Ruby الكود الموجود في كتلة rescue، وهي تطبع رسالة.
وكما هو الحال في كل شيء في Ruby، فإن الاستثناءات أيضًا كائنات، وعادةً ما تحمل بيانات عن الاستثناء. وهكذا يمكننا الحصول على كائن الاستثناء:
begin
# ...any code that raises an exception
rescue => e
puts "Exception class: #{ e.class.name }"
puts "Exception Message:#{e.message}"
end
في Ruby يمكنك أيضًا طرح استثناءاتك الخاصة. على سبيل المثال:
begin
raise ArgumentError.new("Invalid argument")
rescue ArgumentError => e
puts e.message
end
الاستثناء السابق هو أحد الاستثناءات المدمجة في Ruby، لكن يمكنك أيضًا تعريف استثناءات مخصصة وطرحها:
class CustomError < StandardError
end
raise CustomError.new("Something went wrong")
في هذا التمرين ستبني معالجة الأخطاء لآلة حاسبة بسيطة.
الهدف هو الحصول على آلة حاسبة تعمل وتُرجع سلسلة نصية بالصيغة التالية: 16 + 51 = 67، عند تمرير الوسائط 16 و51 و+.
SimpleCalculator.calculate(16, 51, "+")
# => "16 + 51 = 67"
SimpleCalculator.calculate(32, 6, "*")
# => "32 * 6 = 192"
SimpleCalculator.calculate(512, 4, "/")
# => "512 / 4 = 128"
calculate
الطريقة الرئيسية للتنفيذ في هذه المهمة هي طريقة الصنف SimpleCalculator.calculate().
وهي تأخذ ثلاثة وسائط.
الوسيطان الأولان عددان ستُجرى عليهما العملية.
الوسيط الثالث من النوع سلسلة نصية، ومن الضروري في هذا التمرين تنفيذ العمليات التالية:
+
*
/
حدّث الطريقة SimpleCalculator.calculate() لترفع استثناء UnsupportedOperation عند رموز العمليات غير المعروفة.
SimpleCalculator.calculate(1, 2, '-')
# => Raises an UnsupportedOperation
في هذا التمرين، يُتوقع منك تعريف استثناء UnsupportedOperation لنطاق محدد.
حدّث الطريقة SimpleCalculator.calculate() لترفع استثناء ArgumentError عند أنواع الوسائط غير الصالحة.
SimpleCalculator.calculate(1, '2', '*')
# => Raises an ArgumentError
حدّث الطريقة SimpleCalculator.calculate() لتتعامل مع استثناءات ZeroDivisionError.
يجب أن يُرجع كود المعالجة سلسلة نصية تحتوي على Division by zero is not allowed..
ولا ينبغي للطريقة SimpleCalculator.calculate() أن تتعامل مع أي استثناء آخر.
SimpleCalculator.calculate(512, 0, "/")
# => returns "Division by zero is not allowed."
سجّل في Exercism لتتعلّم وتتقن Ruby عبر 21 مفهومًا121 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.