Η Ruby χειρίζεται σφάλματα με (το ισοδύναμο της Ruby με try/catch/finally). Χρησιμοποιείτε για να ρίχνετε εξαιρέσεις και για να τις χειρίζεστε, με για καθαρισμό. Η Ruby επιτρέπει επίσης σε επίπεδο μεθόδου (χωρίς ρητό ) για πιο καθαρό κώδικα.
Η Ruby χειρίζεται σφάλματα με (το ισοδύναμο της Ruby με try/catch/finally). Χρησιμοποιείτε για να ρίχνετε εξαιρέσεις και για να τις χειρίζεστε, με για καθαρισμό. Η Ruby επιτρέπει επίσης σε επίπεδο μεθόδου (χωρίς ρητό ) για πιο καθαρό κώδικα.
begin/rescue/ensureraiserescueensurerescuebeginbegin
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 είναι το try/catch/finally της Ruby. Rescue συγκεκριμένους τύπους (rescue ArgumentError), χρησιμοποιήστε ensure για εγγυημένο καθαρισμό, και else για την περίπτωση χωρίς σφάλμα. Το retry μπορεί να επανατρέξει το block.
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 (το try/catch/finally της Ruby), η σύλληψη συγκεκριμένων τύπων εξαιρέσεων, η χρήση 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 και ένα συνηθισμένο θέμα συνέντευξης.