2010-04-19 25 views
17

Trong kịch bản Python, có rất nhiều trường hợp một ngắt bàn phím (Ctrl-C) thất bại trong việc giết chết quá trình vì một except khoản trống ở đâu đó trong các mã:Tránh vô tình bắt KeyboardInterrupt và SystemExit bằng Python 2.4

try: 
    foo() 
except: 
    bar() 

các giải pháp tiêu chuẩn trong Python 2.5 hoặc cao hơn là để bắt Exception hơn là sử dụng trần except khoản:

try: 
    foo() 
except Exception: 
    bar() 

này hoạt động bởi vì, như của Python 2.5, KeyboardInterruptSystemExit được kế thừa từ BaseException, không phải là Exception. Tuy nhiên, một số cài đặt vẫn chạy Python 2.4. Làm thế nào vấn đề này có thể được xử lý trong các phiên bản trước Python 2.5?

(Tôi sẽ trả lời câu hỏi này bản thân mình, nhưng đặt nó ở đây để mọi người tìm kiếm nó có thể tìm thấy một giải pháp.)

+0

Không đặt câu hỏi chỉ để bạn có thể tự trả lời. SO không phải là một wiki dữ liệu ngẫu nhiên; đó là câu trả lời cho những câu hỏi mà mọi người đang * thực sự hỏi *. –

+3

@Glenn Maynard: Đoán _you_ sai: http://meta.stackexchange.com/questions/12513/should-i-not-answer-my-own-questions – Curd

+0

Trả lời câu hỏi của riêng bạn nếu bạn tìm câu trả lời sau khi hỏi nó ổn. Đặt câu hỏi * để bạn có thể trả lời câu hỏi * hoàn toàn khác. –

Trả lời

13

Theo Python documentation, đúng cách để xử lý này trong các phiên bản Python sớm hơn 2.5 là:

try: 
    foo() 
except (KeyboardInterrupt, SystemExit): 
    raise 
except: 
    bar() 

Rất dài dòng, nhưng ít nhất đó là giải pháp.

+1

Có lẽ bạn nên tạo thứ hai 'except' cũng là' except Exception: ', để tránh bắt các ngoại lệ khác mà không phải bị bắt. –

Các vấn đề liên quan