Why doesn't this python keyboard interrupt work? (in pycharm)

前端 未结 7 1253
被撕碎了的回忆
被撕碎了的回忆 2020-12-03 15:28

My python try/except loop does not seem to trigger a keyboard interrupt when Ctrl + C is pressed while debugging my code in pycharm. My code look like this:



        
7条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-12-03 15:40

    You can also use PyCharm's Python console and use Ctrl + C, if you catch the exception that PyCharm raises when Ctrl + C is pressed. I wrote a short function below called is_keyboard_interrupt that tells you whether the exception is KeyboardInterrupt, including PyCharm's. If it is not, simply re-raise it. I paste a simplified version of the code below.

    When it is run:

    • type 'help' and press Enter to repeat the loop.
    • type anything else and press Enter to check that ValueError is handled properly.
    • Press Ctrl + C to check that KeyboardInterrupt is caught, including in PyCharm's python console.

    Note: This doesn't work with PyCharm's debugger console (the one invoked by "Debug" rather than "Run"), but there the need for Ctrl + C is less because you can simply press the pause button.

    I also put this on my Gist where I may make updates: https://gist.github.com/yulkang/14da861b271576a9eb1fa0f905351b97

    def is_keyboard_interrupt(exception):
        # The second condition is necessary for it to work with the stop button
        # in PyCharm Python console.
        return (type(exception) is KeyboardInterrupt
                or type(exception).__name__ == 'KeyboardInterruptException')
    
    try:
        def print_help():
            print("To exit type exit or Ctrl + c can be used at any time")
        print_help()
    
        while True:
            task = input("What do you want to do? Type \"help\" for help:- ")
            if task == 'help':
                print_help()
            else:
                print("Invalid input.")
    
                # to check that ValueError is handled separately
                raise ValueError()
    
    except Exception as ex:
        try:
            # Catch all exceptions and test if it is KeyboardInterrupt, native or
            # PyCharm's.
            if not is_keyboard_interrupt(ex):
                raise ex
    
            print('KeyboardInterrupt caught as expected.')
            print('Exception type: %s' % type(ex).__name__)
            exit()
    
        except ValueError:
            print('ValueError!')
    

提交回复
热议问题