Ruby აკეთებს შეცდომების დამუშავებას begin/rescue/ensure-ით (Ruby-ის ეკვივალენტი try/catch/finally-სთან). თქვენ raise აკეთებთ გამონაკლისებს და rescue აკეთებთ მათ, ხოლო ensure გამოიყენება სისუფთავისთვის. Ruby ასევე საშუალებას აძლევს მეთოდის დონეზე rescue-ს (ეკსპლიციტური begin-ის გარეშე) სუფთა კოდისთვის.
საბაზო სტრუქტურა
begin
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-ს კონკრეტული ტიპები (rescue ArgumentError), გამოიყენე ensure გარანტირებული სისუფთავისთვის, და else შეცდომის გარეშე შემთხვევისთვის. retry შეუძლია ბლოკის გადამცდელი მცდელობა.
Ruby-ის მნიშვნელოვანი ერთი სიფრთე: rescue StandardError, არა Exception
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-ის rescue-ს (root-ი) ყველაფერი ამჯობინებს, მათ შორის სისტემის დონის სიგნალები როგორიცაა 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
მეთოდის დონეზე rescue (სუფთა)
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), კონკრეტული გამონაკლისის ტიპების rescue-ს აკეთება, ensure-ის გამოყენება გარანტირებული სისუფთავისთვის, და სუფთა მეთოდის დონეზე rescue (ეკსპლიციტური begin-ის გარეშე) ფუნდამენტური ყოველდღიური ცოდნაა.
მით უფრო მნიშვნელოვანი და Ruby-ის თავისებური წერტილი არის StandardError და Exception დისტინქცია: ცარიელი rescue (და სწორი დეფოლტი) ამჯობინებს StandardError-ს, მაგრამ Exception-ის rescue-ს (იერარქიის root-ი) ყველაფერი ამჯობინებს — მათ შორის სისტემის სიგნალები როგორიცაა Interrupt (Ctrl-C) და SystemExit — რომელიც თითქმის არასდროს გინდა, რადგან ეს შეუძლია პროგრამის წყვეტის ან გასვლის აღკვეთა, და არის ხშირი, ზიანი მოტანილი შეცდომა.
ის, რომ StandardError-ის rescue-ს უნდა აკეთო (არა Exception-ის) აპლიკაციის შეცდომებისთვის, მნიშვნელოვანი Ruby-ის სპეციფიკური ცოდნაა, რომელიც სინამდვილე შეცდომებს ხელს უშლის.
სტრუქტურის ცოდნა, მორგებული გამონაკლისის კლასები (StandardError-დან მემკვიდრეობა), retry, მეთოდის დონეზე rescue იდიომა, და განსაკუთრებით StandardError-არა-Exception სიფრთე მნიშვნელოვანია მძლავრი, სწორი Ruby-ის დაწერისთვის, რომელიც შეცდომებს ლამაზად დამუშავებს, პროგრამის წყვეტის უნარის დაკარგვის გარეშე.
დამუშავებული შეცდომები და Exception-rescue-ს შეცდომა ორივე რეალურ პრობლემებს ეწვევა, Ruby-ის გამონაკლისების დამუშავების ათვისება — მისი სტრუქტურა, იდიომები, და კრიტიკული StandardError-Exception დისტინქცია — მნიშვნელოვანია, ხშირად განმეორებადი ცოდნა სანდო Ruby განვითარებისთვის და ხშირი ინტერვიუს თემა.
