2014-12-01 2 views
1

У меня есть этот простой питон скрипт:KeyboardInterrupt Exception работает иногда?

import socket 
import sys 

try: 
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp")) 
except socket.error as msg: 
    print("Could not open socket connection!") 
    print(msg) 
    sys.exit(1) 
try: 
    s.bind(("", 0)) 
    print("Starting the listener...") 
    while True: 
     buff = s.recvfrom(65535) 
     print(buff[1][0]) 
except KeyboardInterrupt: 
    s.close() 
    print("\nManually quitting...") 
    sys.exit(3) 
except socket.error as msg: 
    s.close() 
    print("Socket connection failed!") 
    print(msg) 
    sys.exit(2) 
except: 
    print("Something went wrong! Quitting...") 
    sys.exit(4) 
s.close() 

Когда я запускаю сценарий с Python 3.2.3, исключением клавиатуры Ctrl-C не пойманное все время, а это значит, работает иногда. На самом деле сообщение об ошибке отличается при попытке Ctrl-C из программы в любой момент. Вот вывод на консоли, когда сценарий запускался 3 раза сразу за другим:

$ sudo python3 listener.py 
Starting the listener... 
^CTraceback (most recent call last): 
    File "listener.py", line 14, in <module> 
    buff = s.recvfrom(65535) 
KeyboardInterrupt 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "listener.py", line 17, in <module> 
    s.close() 
    File "/usr/lib/python3.2/socket.py", line 194, in close 
    def close(self): 
KeyboardInterrupt 


$ sudo python3 listener.py 
Starting the listener... 
^CTraceback (most recent call last): 
    File "listener.py", line 14, in <module> 
    buff = s.recvfrom(65535) 
KeyboardInterrupt 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "listener.py", line 14, in <module> 
    buff = s.recvfrom(65535) 
KeyboardInterrupt 


$ sudo python3 listener.py 
Starting the listener... 
^C 
Manually quitting... 

Это работало в последний раз. Почему это работает иногда ?? Что я делаю не так?

+0

Я не могу дублировать ни 3.1, ни 3.4. –

ответ

0

Если изучить трассировки стека внимательно, вы заметите, что есть два исключения которых идет речь с:

Traceback (most recent call last): 
    File "listener.py", line 14, in <module> 

один на линии 14 (в try блоке); и следующий либо снова в строке 14, либо в строке 17 (которая находится в блоке «Вручную бросать»).

Это похоже на то, что у вас есть проблемы с аппаратурой на клавиатуре, и иногда она посылает два <ctrl-c> s вместо одного.