Durante a execução de um programa escrito em Python, você pode querer interromper a execução do mesmo, por algum problema ou por querer adicionar alguma coisa no código, mas quando se interrompe pelo terminal com o tradicional Ctrl + C uma mensagem chata é reportada, vamos ao exemplo keyboardinterruptex.py:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ Tratamento Ctrl + C """ def main(): ano = input("Informe o ano: ") print "Ano digitado: ", ano if __name__ == "__main__": main()
Código simples, inicia exibi a mensagem “Informe o ano” no terminal e espera você digitar, porém irei pressionar Ctrl + C para interromper a execução e vamos ver o que aparece no terminal.
cleiton@linuxVM:~/projetos/python/exceptions$ python keyboardinterrumptex.py Informe o ano: ^CTraceback (most recent call last): File "keyboardinterrumptex.py", line 14, in <module> main() File "keyboardinterrumptex.py", line 9, in main ano = input("Informe o ano: ") KeyboardInterrupt cleiton@linuxVM:~/projetos/python/exceptions$
Coisa feia né? Uma época tentei resolver de um modo elegante mas acabei abandonando por não ter encontrado a solução (não pesquisei direito :)) ae por esses dias lendo docs.python.org entrei na parte de Built-in Exceptions e esta tudo lá ae foi fácil, vamos ver como contornar esse caso.
#!/usr/bin/env python # -*- coding: utf-8 -*- """ Tratamento Ctrl + C """ def main(): ano = input("Informe o ano: ") print "Ano digitado: ", ano if __name__ == "__main__": try: main() except (KeyboardInterrupt): print "nnVoce pressionou Ctrl+C ou Delete para interromper este programa!n"
Executando e interrompendo:
cleiton@linuxVM:~/projetos/python/exceptions$ python keyboardinterrumptex.py Informe o ano: 2014 Ano digitado: 2014 cleiton@linuxVM:~/projetos/python/exceptions$ python keyboardinterrumptex.py Informe o ano: ^C Voce pressionou Ctrl+C ou Delete para interromper este programa! cleiton@linuxVM:~/projetos/python/exceptions$
Segundo o doc do Python:
”
exception KeyboardInterrupt
Raised when the user hits the interrupt key (normally Control-C or Delete).
”
Foi mais do que suficiente quando eu li, no caso no except (KeyboardInterrupt) eu coloquei um print para dar uma mensagem na tela, caso você queira que saia sem reportar nada poderia fazer assim:
#!/usr/bin/env python # -*- coding: utf-8 -*- """ Tratamento Ctrl + C """ def main(): ano = input("Informe o ano: ") print "Ano digitado: ", ano if __name__ == "__main__": try: main() except (KeyboardInterrupt): pass
Vale muito a pena conferir esta parte de Build-in Exceptions do docs.python.org além de estudar os diversos tipos de exceções como (StandardError, ArithmeticError, EnvironmentError, IOError, KeyError, KeyboardInterrupt, MemoryError, NameError, OSError, ImportError, ReferenceError, SintaxError, TabError, SystemExit e dentre outros).
Espero que tenham gostado e até a próxima!
Referência
https://docs.python.org/2/library/exceptions.html
Python – Usando keyboardInterrupt do Exceptions by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.