Sobes.tech
Middle+

¿Qué mecanismos existen para interrumpir el funcionamiento de una parte del proyecto?

sobes.tech AI

Respuesta de la IA

  • Excepciones: Permiten detener la ejecución del código cuando ocurre un error y transferir el control a los bloques begin/rescue/ensure.

    begin
      # Código que puede causar un error
      result = 1 / 0
    rescue ZeroDivisionError => e
      # Manejo de error específico
      puts "Error de división por cero: #{e.message}"
      # Posible registro o ejecución alternativa
    rescue StandardError => e
      # Manejo de otros errores estándar
      puts "Ocurrió otro error: #{e.message}"
    ensure
      # Código que siempre se ejecuta, independientemente de si hay error o no
      puts "Fin del bloque"
    end
    
  • Raise: Disparo explícito de una excepción, tanto para clases de error estándar como personalizadas.

    # Disparo normal de una excepción
    raise "Algo salió mal"
    
    # Disparo con una clase de error específica
    raise MyCustomError, "Valor no válido"
    
  • exit, abort, Kernel#exit!: Métodos para terminar la ejecución del programa. exit! termina inmediatamente sin llamar a los manejadores at_exit.

    # Finalización normal del programa
    exit(0) # 0 indica finalización exitosa
    
    # Finalización con error
    abort("Finalización por error crítico")
    
    # Finalización forzada
    Kernel.exit!(1)
    
  • Thread#raise: Permite lanzar una excepción en otro hilo de ejecución.

    thread = Thread.new do
      begin
        loop { sleep 1 }
      rescue => e
        puts "Hilo capturado: #{e.class}"
      end
    end
    
    sleep 2
    thread.raise StandardError, "Detener hilo"
    thread.join
    
  • Errores de programación (lógicos, sintácticos): Código mal escrito puede causar fallos en la ejecución.

    # Error sintáctico (falta end)
    def my_method
      puts "Hola"
    
    # Error lógico (bucle infinito)
    while true
      puts "Bucle"
    end
    
  • Señales del sistema operativo (SIGTERM, SIGINT, etc.): Pueden interrumpir la ejecución del programa desde fuera.

    # Ejemplo simple de manejo de señal SIGINT (Ctrl+C)
    Signal.trap("INT") { puts "\nSe capturó SIGINT. Finalizando..."; exit }
    
    loop { sleep 1 }
    
  • Aserciones (especialmente en desarrollo y pruebas): Mecanismos para verificar condiciones, y si se violan, lanzar una excepción u otra acción. En Ruby, a menudo se implementan con bibliotecas de pruebas.

    # Ejemplo usando la biblioteca MiniTest
    require 'minitest/autorun'
    
    class MyTest < Minitest::Test
      def test_division
        # Aserción: el resultado de dividir 4 entre 2 es 2
        assert_equal 2, 4 / 2
        # Aserción: dividir por cero debe lanzar ZeroDivisionError
        assert_raises(ZeroDivisionError) { 1 / 0 }
      end
    end