* Es gibt prinzipiell 2 verschiedene Ansätze * Handling direkt des Signals * Exception catchen * u.a. kann das genutzt werden um KeyboardInterrupt (SIGINT) abzufangen ====== Exceptions ====== * die meisten Signale führen (wenn nicht umgebogen) zu einer Exception * Problem ist, dass man meist nicht weiß wann das Signal im Code auftritt Lösen kann man das, in dem man den try-Except-Block einfach um den ersten Methoden-Aufruf schreibt den man macht, denn aller weiterer Code wird durch diese Methode aufgerufen und damit läuft die Exception auch bis zu diesem Punkt "hoch". def something(): do something try: if __name__ == __main__: something() except KeyboardInterrupt: Some exception handling In obigem Beispiel wird die KeyBoardInterrupt-Exception immer abgefangen, auch wenn zu dem Zeitpunkt Code von der Methode "something" ausgeführt wird - da die Exception bis zum Methodenaufruf "hochläuft". Wird ein weiteres mal Ctrl+C gedrückt während man im Exception-Handling ist, wird die Exception logischerweise nicht mehr abgefangen. Deswegen sollte man im except-Block das signal per "signal.signal(signal.SIGINT, signal.SIG_IGN)" blockieren (siehe nächste Sektion für Details). ====== Signal-Handling ====== * Python erlaubt es Call-Back-Methoden zu definieren die ausgeführt werden wenn ein Signal eintritt * einmal definiert werden sie immer aufgerufen, egal an welcher Stelle im Code die Ausführung ist * natürlich nur, bis sie anders definiert werden import signal import time def handlermethod(arg1, arg2): print("Abgefangen") print('Argumente:', arg1, arg2) signal.signal(signal.SIGINT, handlermethod) time.sleep(60) In obigem Beispiel wird das Auftreten von SIGINT im ganzen Programm abgefangen. \\ Kommt es zu SIGINT wird der handler "handlermethod" aufgerufen und nach dessen Abarbeitung mit dem normalen Code fortgefahren (sprich mit sleep).