2013-05-19 24 views
9

Khi giải cứu từ một ngoại lệ, có hai cách để tham khảo các ngoại lệ nêu ra:

begin 
    ... 
rescue Exception => e 
    handle_the_error(e) 
end 

begin 
    ... 
rescue Exception 
    handle_the_error($!) 
end 

Tôi tin rằng họ có thể hoán đổi, nhưng chúng là gì? Có tình huống nào nên sử dụng cho người kia không?

+0

Dưới đây là quá nhiều ['ví dụ'] (http://stackoverflow.com/search?q=inline+rescue) trừ trường hợp này. –

Trả lời

9

Tôi cũng nghĩ rằng các đoạn mã này có thể hoán đổi cho nhau. Nhưng bạn nên luôn luôn thích các biến rõ ràng cho phép thuật chuỗi toàn cầu.

Một trường hợp $! diệu var là tiện dụng:

result_or_error = perform_some_operation() rescue $! 

Đối với những người không biết rằng dòng này có nghĩa là:

Nó cái gọi là "inline giải cứu". Định dạng là:

<expr1> rescue <expr2> 

Đầu tiên, expr1 được đánh giá. Nếu không có ngoại lệ nào được nêu ra, giá trị của nó sẽ được trả về. Nhưng nếu có ngoại lệ, thì expr2 được đánh giá và giá trị của nó được trả lại.

Vì vậy, trong trường hợp này, nếu perform_some_operation() nêu ra một ngoại lệ, biến result_or_error sẽ được đặt thành một trường hợp ngoại lệ đó (vì $! trả về lỗi cuối cùng).

+0

Bạn có thể giải thích điều gì làm vui lòng không? –

+0

Cập nhật câu trả lời –

+1

Cảm ơn bạn. Điều đó thực sự khá tuyệt vời. –

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