Tôi đã được thông qua một chương trình di sản ruby chạy dài, trong đó có nhiều lần xuất hiện củachụp Ctrl-c trong ruby
begin
#dosomething
rescue Exception => e
#halt the exception's progress
end
suốt nó.
Nếu không theo dõi xuống mỗi thể ngoại lệ duy nhất này từng có thể được xử lý (ít nhất là không ngay lập tức), tôi vẫn muốn để có thể đóng cửa vào những thời điểm với CtrlC.
Và tôi muốn làm như vậy trong một cách mà chỉ thêm vào đoạn code (vì vậy tôi không ảnh hưởng đến hành vi hiện tại, hoặc bỏ lỡ một ngoại lệ khác đánh bắt ở giữa của một hoạt động.)
[CtrlC là SIGINT hoặc SystemExit, có vẻ tương đương với SignalException.new("INT")
trong hệ thống xử lý ngoại lệ của Ruby. class SignalException < Exception
, đó là lý do tại sao vấn đề này đi lên]
Mã Tôi muốn có văn bản sẽ là:.
begin
#dosomething
rescue SignalException => e
raise e
rescue Exception => e
#halt the exception's progress
end
EDIT: Mã này hoạt động, miễn là bạn sẽ có được lớp của ngoại lệ bạn muốn bẫy đúng. Đó là SystemExit, Interrupt hoặc IRB :: Abort như dưới đây.
Wayne, bạn sẽ rất tử tế khi thêm một IRB :: Ví dụ hủy bỏ vào danh sách của bạn? –
@Tim, đi tìm irb.rb (trên hệ thống của tôi, nó nằm trong /usr/lib/ruby/1.8/irb.rb) và tìm vòng lặp chính (tìm kiếm @ context.evaluate). Nhìn vào các điều khoản giải cứu và tôi nghĩ bạn sẽ hiểu tại sao IRB hành xử theo cách đó. –
cảm ơn bạn. Nhìn vào định nghĩa cho #signal_handle trong irb.rb cũng giúp tôi hiểu. Họ có một thủ thuật gọn gàng trong vòng lặp chính của biến ngoại lệ ràng buộc là tốt. (Sử dụng các mệnh đề giải cứu như một cách để chọn ra một ngoại lệ cụ thể, sau đó sử dụng ngoại lệ đó bên ngoài các cơ quan cứu hộ.) –