2012-01-26 26 views
6

Tôi viết một số mã trong Python một cái gì đó như thế này:Trong Python, tôi có thể ngăn một hàm bắt được KeyboardInterrupt và SystemExit không?

import sys 
try: 
    for x in large_list: 
     function_that_catches_KeyboardInterrupt(x) 
except KeyboardInterrupt: 
    print "Canceled!" 
    sys.exit(1) 

Khi tôi cố gắng làm gián đoạn vòng lặp, tôi về cơ bản cần phải giữ phím kiểm soát + C đủ lâu để hủy bỏ tất cả các gọi của hàm cho tất cả các thành phần của large-list và chỉ khi đó chương trình của tôi thoát.

Có cách nào tôi có thể ngăn chặn chức năng bắt KeyboardInterrupt để tôi có thể tự mình bắt được không? Cách duy nhất tôi có thể nghĩ sẽ là lạm dụng luồng bằng cách tạo ra một chuỗi riêng biệt chỉ để gọi hàm, nhưng điều đó có vẻ quá mức.

Chỉnh sửa: Tôi đã kiểm tra mã vi phạm (mà tôi không thể dễ dàng thay đổi) và nó thực sự sử dụng một số except: trống, vì vậy ngay cả sys.exit(1) bị phát hiện là một ngoại lệ SystemExit. Làm cách nào để thoát khỏi khối except: và thoát khỏi chương trình của tôi?

+0

Không có vẻ quá mức với tôi ... cũng bởi vì mọi giải pháp khác tôi có thể đưa ra ma thuật ... – GaretJax

+0

Lưu ý rằng bạn không cần phải sử dụng một chuỗi cho mỗi lời gọi, chỉ có một là đủ. ;-) – GaretJax

Trả lời

6

Bạn có thể khôi phục trình xử lý SIGINT bằng cách sử dụng thư viện signal.

import signal, sys 
def handler(signal, frame): 
    print "Canceled!" 
    sys.exit(1) 
signal.signal(signal.SIGINT, handler) 
for x in large_list: 
    function_that_catches_KeyboardInterrupt(x) 

Có một số cách mà bạn có thể thoát khi SystemExit bị bắt. os._exit(1) sẽ thực hiện lối thoát kiểu c mà không dọn dẹp. os.kill(os.getpid(), signal.SIGTERM) sẽ cho phép thông dịch viên ở một mức dọn dẹp nào đó, tôi tin rằng các chốt xử lý xóa/đóng, v.v.

+0

Tôi nghĩ anh ta muốn tín hiệu bị bắt bởi trình xử lý ngoại lệ bên ngoài, mặc dù - không phải bởi mã bên trong hàm. Điều này sẽ ngăn chặn nó hoàn toàn –

+0

Sau đó, ông có thể thay thế các cuộc gọi sys.exit với một cái gì đó mà tay kiểm soát trở lại chương trình của mình. Bạn đang đối phó với việc kiểm soát luồng cướp, tôi không nghĩ rằng bạn sẽ tìm thấy một giải pháp thanh lịch hơn;) – stefan

+0

Tôi có thể thay thế 'sys.exit' bằng' raise KeyboardInterrupt() 'không? Hoặc tôi sẽ cần phải sử dụng một ngoại lệ khác? –

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