Sobes.tech
Middle+

Ποιοι μηχανισμοί υπάρχουν για να διαταράξουν τη λειτουργία ενός μέρους του έργου;

sobes.tech AI

Απάντηση από AI

  • Εξαιρέσεις (Exceptions): Επιτρέπουν να διακόψετε την εκτέλεση του κώδικα όταν προκύψει σφάλμα και να μεταβιβάσετε τον έλεγχο στα μπλοκ begin/rescue/ensure.

    begin
      # Κώδικας που μπορεί να προκαλέσει σφάλμα
      result = 1 / 0
    rescue ZeroDivisionError => e
      # Διαχείριση συγκεκριμένου σφάλματος
      puts "Σφάλμα διαίρεσης με το μηδέν: #{e.message}"
      # Πιθανή καταγραφή ή εναλλακτική εκτέλεση
    rescue StandardError => e
      # Διαχείριση άλλων τυπικών σφαλμάτων
      puts "Ένα άλλο σφάλμα συνέβη: #{e.message}"
    ensure
      # Κώδικας που εκτελείται πάντα, ανεξάρτητα από το αν υπάρχει σφάλμα
      puts "Τέλος μπλοκ"
    end
    
  • Raise: Ρύθμιση ρητά μιας εξαίρεσης, τόσο για τυπικές όσο και για προσαρμοσμένες κλάσεις σφαλμάτων.

    # Κανονική ενεργοποίηση εξαίρεσης
    raise "Κάτι πήγε στραβά"
    
    # Με συγκεκριμένη κλάση σφάλματος
    raise MyCustomError, "Μη έγκυρη τιμή"
    
  • exit, abort, Kernel#exit!: Μέθοδοι για τερματισμό του προγράμματος. Το exit! τερματίζει αμέσως χωρίς να καλεί τους χειριστές at_exit.

    # Κανονική λήξη προγράμματος
    exit(0) # 0 σημαίνει επιτυχημένη λήξη
    
    # Τερματισμός με σφάλμα
    abort("Τερματισμός λόγω κρίσιμου σφάλματος")
    
    # Αναγκαστικός τερματισμός
    Kernel.exit!(1)
    
  • Thread#raise: Επιτρέπει την ενεργοποίηση εξαίρεσης σε άλλο νήμα εκτέλεσης.

    thread = Thread.new do
      begin
        loop { sleep 1 }
      rescue => e
        puts "Το νήμα πιάστηκε: #{e.class}"
      end
    end
    
    sleep 2
    thread.raise StandardError, "Διακοπή νήματος"
    thread.join
    
  • Σφάλματα προγραμματισμού (λογικά, συντακτικά): Ο κακός γραμμένος κώδικας μπορεί να οδηγήσει σε σφάλματα κατά την εκτέλεση.

    # Συντακτικό σφάλμα (λείπει το end)
    def my_method
      puts "Γειά σου"
    
    # Λογικό σφάλμα (ατέρμονη βρόχος)
    while true
      puts "Βρόχος"
    end
    
  • Σήματα λειτουργικού συστήματος (SIGTERM, SIGINT και άλλα): Μπορούν να διακόψουν την εκτέλεση του προγράμματος από έξω.

    # Απλό παράδειγμα χειρισμού σήματος SIGINT (Ctrl+C)
    Signal.trap("INT") { puts "\nΤο SIGINT πιάστηκε. Τερματισμός..."; exit }
    
    loop { sleep 1 }
    
  • Επικυρώσεις (ιδιαίτερα κατά την ανάπτυξη και δοκιμές): Μηχανισμοί ελέγχου συνθηκών, που, αν παραβιαστούν, ρίχνουν εξαίρεση ή εκτελούν άλλη ενέργεια. Στη Ruby, συχνά υλοποιούνται με βιβλιοθήκες δοκιμών.

    # Παράδειγμα με τη βιβλιοθήκη MiniTest
    require 'minitest/autorun'
    
    class MyTest < Minitest::Test
      def test_division
        # Δήλωση: το αποτέλεσμα της διαίρεσης 4 με 2 είναι 2
        assert_equal 2, 4 / 2
        # Δήλωση: η διαίρεση με το μηδέν πρέπει να προκαλέσει ZeroDivisionError
        assert_raises(ZeroDivisionError) { 1 / 0 }
      end
    end