Exceptions

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

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).