Οι εξαιρέσεις στη 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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.