Quais mecanismos existem para perturbar o funcionamento de uma parte do projeto?
sobes.tech IA
Resposta da IA
-
Exceções: Permitem parar a execução do código quando ocorre um erro e transferir o controlo para os blocos
begin/rescue/ensure.begin # Código que pode causar um erro result = 1 / 0 rescue ZeroDivisionError => e # Tratamento de erro específico puts "Erro de divisão por zero: #{e.message}" # Possível registo ou execução alternativa rescue StandardError => e # Tratamento de outros erros padrão puts "Ocorreu outro erro: #{e.message}" ensure # Código que sempre é executado, independentemente de haver erro ou não puts "Fim do bloco" end -
Raise: Disparo explícito de uma exceção, tanto para classes de erro padrão como personalizadas.
# Disparo normal de uma exceção raise "Algo correu mal" # Disparo com uma classe de erro específica raise MyCustomError, "Valor inválido" -
exit,abort,Kernel#exit!: Métodos para terminar a execução do programa.exit!termina imediatamente sem chamar os manipuladoresat_exit.# Finalização normal do programa exit(0) # 0 indica uma saída bem-sucedida # Finalização com erro abort("Finalização devido a erro crítico") # Finalização forçada Kernel.exit!(1) -
Thread#raise: Permite lançar uma exceção noutra thread de execução.
thread = Thread.new do begin loop { sleep 1 } rescue => e puts "Thread capturado: #{e.class}" end end sleep 2 thread.raise StandardError, "Parar thread" thread.join -
Erros de programação (lógicos, sintácticos): Código mal escrito pode levar a falhas na execução.
# Erro sintáctico (falta end) def my_method puts "Olá" # Erro lógico (bucle infinito) while true puts "Bucle" end -
Sinais do sistema operativo (SIGTERM, SIGINT, etc.): Podem interromper a execução do programa de fora.
# Exemplo simples de tratamento de sinal SIGINT (Ctrl+C) Signal.trap("INT") { puts "\nSinal SIGINT capturado. A terminar..."; exit } loop { sleep 1 } -
Aserções (especialmente em desenvolvimento e testes): Mecanismos de verificação de condições, que, se violadas, lançam uma exceção ou realizam outra ação. Em Ruby, frequentemente implementadas com bibliotecas de testes.
# Exemplo usando a biblioteca MiniTest require 'minitest/autorun' class MyTest < Minitest::Test def test_divisao # Asserção: o resultado de dividir 4 por 2 é 2 assert_equal 2, 4 / 2 # Asserção: dividir por zero deve lançar ZeroDivisionError assert_raises(ZeroDivisionError) { 1 / 0 } end end