Sobes.tech
Middle+

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 manipuladores at_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