63 votes

Gestion globale des exceptions Python

Je veux attraper KeyboardInterrupt monde et m'en occuper gentiment. Je ne veux pas enfermer tout mon script dans une énorme instruction try/except. Y a-t-il un moyen de faire ça?

135voto

multipleinterfaces Points 2917

Vous pouvez modifier sys.excepthook si vous ne voulez vraiment pas utiliser un try/except .

 import sys
def my_except_hook(exctype, value, traceback):
    if exctype == KeyboardInterrupt:
        print "Handler code goes here"
    else:
        sys.__excepthook__(exctype, value, traceback)
sys.excepthook = my_except_hook

26voto

Rob Cowie Points 10471

S'il s'agit d'un script à exécuter sur la ligne de commande, vous pouvez encapsuler votre logique d'exécution dans main() , l'appeler dans un if __name__ == '__main__' et l'encapsuler.

 if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        print 'Killed by user'
        sys.exit(0)

16voto

mouad Points 21520

Vous pouvez également utiliser un signal comme celui-ci :

 import signal, time

def handler(signum, frame):
    print 'I just clicked on CTRL-C '

signal.signal(signal.SIGINT, handler)

print "waiting for 10 s"
time.sleep(10)

Sortir:

 waiting for 10 s
^CI just clicked on CTRL-C

NB : Ne mélangez pas l'utilisation du signal avec les threads.

10voto

Claudiu Points 58398

Votre script a-t-il une fonction que vous appelez pour le démarrer ?

 main()

alors il suffit de faire :

 try:
    main()
except:
    ...

Si vous n'avez pas de main mais juste un énorme script qui s'exécute ligne par ligne, alors vous devriez le mettre dans un main .

1voto

Tamás Points 18211

Il n'y a pas d'autre moyen de le faire, à part encapsuler votre script entier dans une fonction main() et l'entourer d'un try..except - ce qui est à peu près la même chose :

 def main():
    # Your script goes here
    pass

if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        # cleanup code here
        pass

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X