Tôi đang viết python 2.6.6 mã trên cửa sổ trông như thế này:Tại sao tôi không thể xử lý KeyboardInterrupt trong python?
try:
dostuff()
except KeyboardInterrupt:
print "Interrupted!"
except:
print "Some other exception?"
finally:
print "cleaning up...."
print "done."
dostuff()
là một chức năng mà vòng mãi mãi, đọc một dòng cùng một lúc từ một dòng đầu vào và tác động lên nó. Tôi muốn để có thể ngăn chặn nó và làm sạch khi tôi nhấn ctrl-c.
Điều đang xảy ra thay vào đó là mã dưới except KeyboardInterrupt:
không hoạt động chút nào. Điều duy nhất mà được in là "dọn dẹp ...", và sau đó một traceback được in trông như thế này:
Traceback (most recent call last):
File "filename.py", line 119, in <module>
print 'cleaning up...'
KeyboardInterrupt
Vì vậy, mã xử lý ngoại lệ là không được chạy, và traceback tuyên bố rằng một KeyboardInterrupt xảy ra trong mệnh đề cuối cùng, điều này không có ý nghĩa bởi vì nhấn ctrl-c là nguyên nhân khiến phần đó chạy ở vị trí đầu tiên! Ngay cả các khoản except:
chung không chạy.
EDIT: Dựa trên nhận xét, tôi đã thay thế nội dung của khối try:
bằng sys.stdin.read(). Vấn đề vẫn xảy ra chính xác như được mô tả, với dòng đầu tiên của khối finally:
đang chạy và sau đó in cùng một dấu vết.
EDIT # 2: Nếu tôi thêm nhiều thứ sau khi đọc, trình xử lý hoạt động. Vì vậy, điều này không:
try:
sys.stdin.read()
except KeyboardInterrupt:
...
Nhưng công trình này:
try:
sys.stdin.read()
print "Done reading."
except KeyboardInterrupt:
...
Dưới đây là những gì đang in là: "Xong đọc"
Done reading. Interrupted!
cleaning up...
done.
Vì vậy, đối với một số lý do, dòng được in, mặc dù ngoại lệ xảy ra trên dòng trước đó. Đó không thực sự là một vấn đề - rõ ràng là tôi phải có khả năng xử lý một ngoại lệ ở bất cứ đâu trong khối "thử". Tuy nhiên, các bản in không hoạt động bình thường - nó không in một dòng mới sau đó như nó được cho là! Các "Interruped" được in trên cùng một dòng ... với một không gian trước đó, vì một lý do nào đó ...? Dù sao đi nữa, sau đó mã đó thực hiện những gì nó được yêu cầu.
Dường như với tôi rằng đây là lỗi trong việc xử lý gián đoạn trong suốt cuộc gọi hệ thống bị chặn.
Hiển thị mã cho dostuff() của bạn, vì mã này sẽ hoạt động (và nó) – user225312
Nó hoạt động như mong đợi với Python 2.5.1. – khachik
sao chép bằng Python 2.7, thay thế 'dostuff()' bằng 'sys.stdin.read()' – balpha