2009-07-17 46 views
11

Tôi có thể xác định trạng thái thoát khỏi quy trình của bản thân trong khối at_exit không?ruby ​​at_exit trạng thái thoát

at_exit do 
    if this_process_status.success? 
    print 'Success' 
    else 
    print 'Failure' 
    end 
end 

Trả lời

14

sử dụng ý tưởng từ tadman

at_exit do 
    if $!.nil? || $!.is_a?(SystemExit) && $!.success? 
    print 'success' 
    else 
    code = $!.is_a?(SystemExit) ? $!.status : 1 
    print "failure with code #{code}" 
    end 
end 
+2

chỉ là ý kiến ​​của tôi là cung cấp cho "kiểm tra" để tadman thay vì chính mình/nhún vai. –

+1

Tôi nghĩ rằng câu trả lời đầy đủ nhất nên được kiểm tra. Kiểm tra là hữu ích nhất cho những người dùng khác tìm kiếm câu trả lời và tôi không nghĩ rằng bất cứ điều gì sẽ thay đổi cho tôi và tadman, bất cứ câu trả lời tôi sẽ kiểm tra. – tig

+0

Tôi nghĩ rằng sử dụng 'at_exit' cho điều này là ok cho các kịch bản nhỏ. Đối với các ứng dụng lớn hơn, bạn nên sử dụng 'thoát' (hoặc gọi phương thức của riêng bạn để xử lý thoát) tại các điểm xuất phát dự định và xử lý lỗi, ngoại lệ và tín hiệu một cách rõ ràng. – Kelvin

17

Mặc dù tài liệu này rất mỏng, $! được thiết lập là ngoại lệ cuối cùng xảy ra, và sau khi exit() gọi đây là ngoại lệ SystemExit. Đưa hai cùng bạn có được điều này:

at_exit do 
    if ($!.success?) 
    print 'Success' 
    else 
    print 'Failure' 
    end 
end 
+0

Đó sẽ là trường hợp duy nhất nếu exit sẽ được gọi. Chắc chắn tôi có thể được kiểm tra nếu $! là không hoặc là SystemExit mà câu trả lời đúng về sự thành công? Nhưng có thể nhận được Process :: Status object hoặc nó không được tạo ra cho quá trình trên không? – tig

+0

sử dụng ý tưởng của bạn Tôi đã nhận được câu trả lời và được đăng nhưng tôi không biết câu trả lời nào tốt hơn để đánh dấu - của bạn hoặc của tôi? – tig

+0

Bất cứ điều gì phù hợp với bạn. Không biết bạn có thể "trả lời" câu hỏi của riêng bạn, nhưng được rồi. – tadman

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