استثناها در 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)
اگر بخواهیم جلوی این فرایند خاتمه را بگیریم، باید به استثنا واکنش نشان دهیم. به این کار rescue کردن استثنا میگویند:
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 و +، رشتهای با الگوی زیر برگرداند: 16 + 51 = 67.
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."