Sobes.tech
Middle+

Quels mécanismes existent pour perturber le fonctionnement d'une partie du projet?

sobes.tech IA

Réponse de l'IA

  • Exceptions (Exceptions): Permettent d'arrêter l'exécution du code en cas d'erreur et de transférer le contrôle aux blocs begin/rescue/ensure.

    begin
      # Code pouvant provoquer une erreur
      result = 1 / 0
    rescue ZeroDivisionError => e
      # Gestion d'une erreur spécifique
      puts "Erreur de division par zéro : #{e.message}"
      # Possibilité de journalisation ou d'exécution alternative
    rescue StandardError => e
      # Gestion d'autres erreurs standard
      puts "Une autre erreur est survenue : #{e.message}"
    ensure
      # Code qui s'exécute toujours, indépendamment de l'erreur
      puts "Fin du bloc"
    end
    
  • Raise: Déclenchement explicite d'une exception, pour les classes d'erreur standard ou personnalisées.

    # Déclenchement normal d'une exception
    raise "Quelque chose s'est mal passé"
    
    # Déclenchement avec une classe d'erreur spécifique
    raise MyCustomError, "Valeur invalide"
    
  • exit, abort, Kernel#exit!: Méthodes pour terminer l'exécution du programme. exit! termine immédiatement sans appeler les gestionnaires at_exit.

    # Fin normale du programme
    exit(0) # 0 indique une sortie réussie
    
    # Fin avec erreur
    abort("Fin due à une erreur critique")
    
    # Fin forcée
    Kernel.exit!(1)
    
  • Thread#raise: Permet de lancer une exception dans un autre thread.

    thread = Thread.new do
      begin
        loop { sleep 1 }
      rescue => e
        puts "Thread intercepté : #{e.class}"
      end
    end
    
    sleep 2
    thread.raise StandardError, "Arrêt du thread"
    thread.join
    
  • Erreurs de programmation (logiques, syntaxiques): Un code mal écrit peut entraîner des défaillances.

    # Erreur syntaxique (absence de end)
    def my_method
      puts "Bonjour"
    
    # Erreur logique (boucle infinie)
    while true
      puts "Boucle"
    end
    
  • Signaux du système d'exploitation (SIGTERM, SIGINT, etc.): Peuvent interrompre l'exécution du programme depuis l'extérieur.

    # Exemple simple de gestion du signal SIGINT (Ctrl+C)
    Signal.trap("INT") { puts "\nSignal SIGINT capturé. Fin..."; exit }
    
    loop { sleep 1 }
    
  • Assertions (surtout en développement et en test): Mécanismes de vérification des conditions, qui, en cas de violation, lancent une exception ou effectuent une autre action. En Ruby, souvent implémentées avec des bibliothèques de test.

    # Exemple avec la bibliothèque MiniTest
    require 'minitest/autorun'
    
    class MyTest < Minitest::Test
      def test_division
        # Assertion : le résultat de 4 divisé par 2 est 2
        assert_equal 2, 4 / 2
        # Assertion : la division par zéro doit lancer ZeroDivisionError
        assert_raises(ZeroDivisionError) { 1 / 0 }
      end
    end