¿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 manejadoresat_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