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