Sobes.tech
Middle+

Welche Mechanismen gibt es, um die Arbeit eines Teils des Projekts zu stören?

sobes.tech KI

Antwort von AI

  • Ausnahmen (Exceptions): Ermöglichen es, die Ausführung des Codes bei einem Fehler zu stoppen und die Kontrolle an die Blöcke begin/rescue/ensure zu übertragen.

    begin
      # Code, der einen Fehler verursachen kann
      result = 1 / 0
    rescue ZeroDivisionError => e
      # Behandlung eines spezifischen Fehlers
      puts "Fehler bei Division durch Null: #{e.message}"
      # Mögliche Protokollierung oder alternative Ausführung
    rescue StandardError => e
      # Behandlung anderer Standardfehler
      puts "Ein anderer Fehler ist aufgetreten: #{e.message}"
    ensure
      # Code, der immer ausgeführt wird, unabhängig vom Fehler
      puts "Block beendet"
    end
    
  • Raise: Explizites Auslösen einer Ausnahme, sowohl für Standard- als auch für benutzerdefinierte Fehlerklassen.

    # Normales Auslösen einer Ausnahme
    raise "Etwas ist schief gelaufen"
    
    # Auslösen mit einer bestimmten Fehlerklasse
    raise MyCustomError, "Ungültiger Wert"
    
  • exit, abort, Kernel#exit!: Methoden zum Beenden des Programms. exit! beendet das Programm sofort, ohne at_exit-Handler aufzurufen.

    # Normales Beenden des Programms
    exit(0) # 0 bedeutet erfolgreicher Abschluss
    
    # Beenden mit Fehler
    abort("Beendet wegen kritischem Fehler")
    
    # Erzwingendes Beenden
    Kernel.exit!(1)
    
  • Thread#raise: Ermöglicht das Auslösen einer Ausnahme in einem anderen Ausführungsthread.

    thread = Thread.new do
      begin
        loop { sleep 1 }
      rescue => e
        puts "Thread abgefangen: #{e.class}"
      end
    end
    
    sleep 2
    thread.raise StandardError, "Thread stoppen"
    thread.join
    
  • Programmierfehler (logisch, syntaktisch): Schlechter geschriebenen Code kann zu Laufzeitfehlern führen.

    # Syntaxfehler (fehlendes end)
    def my_method
      puts "Hallo"
    
    # Logischer Fehler (Endlosschleife)
    while true
      puts "Schleife"
    end
    
  • Betriebssystemsignale (SIGTERM, SIGINT usw.): Können die Programmausführung von außen unterbrechen.

    # Einfaches Beispiel für die Behandlung des SIGINT-Signals (Strg+C)
    Signal.trap("INT") { puts "\nSIGINT empfangen. Beenden..."; exit }
    
    loop { sleep 1 }
    
  • Assertions (besonders bei Entwicklung und Tests): Mechanismen zur Überprüfung von Bedingungen, bei Verletzung wird eine Ausnahme ausgelöst oder eine andere Aktion ausgeführt. In Ruby werden sie oft mit Testbibliotheken implementiert.

    # Beispiel mit der MiniTest-Bibliothek
    require 'minitest/autorun'
    
    class MyTest < Minitest::Test
      def test_division
        # Behauptung: Das Ergebnis von 4 durch 2 ist 2
        assert_equal 2, 4 / 2
        # Behauptung: Division durch Null löst ZeroDivisionError aus
        assert_raises(ZeroDivisionError) { 1 / 0 }
      end
    end