2011-10-20 23 views

Trả lời

6

Bạn có thể bọC#on: do chặn trong một khối khác có #ensure: được đính kèm với nó.

+0

Ah thực sự. Tôi nghĩ về nó nhưng bằng cách nào đó tôi nghĩ rằng nó sẽ thực hiện khối bên trong hai lần, bởi vì cả hai #on: do: và #ensure: send #value. – milan

+1

'#ensure:' 's gửi' # value' sẽ đánh giá nội dung của nó, nó sẽ gửi '#on: do:' đến nội dung của nó, từ đó sẽ gửi '# value' đến khối trong cùng, cuối cùng sẽ Làm gì đó hữu ích. Nói cách khác, hai '# value' gửi sẽ được gửi đến các khối khác nhau. –

1

Tôi không chắc tôi đã hiểu câu hỏi của bạn, nhưng nếu tôi đã làm và bạn có nghĩa là "cách xử lý ngoại lệ nếu nó được kích hoạt và tiếp tục thực hiện bình thường", thì đây là những gì bạn có thể làm:

[self doWhatever] on: SomeException do: [self handleSomeException]. 
self continueNormally. 

Kiểm tra tất cả các lớp con của Ngoại lệ để xem loại ngoại lệ nào bạn có thể chụp.

Hy vọng điều đó đã hữu ích!

+0

Khối cuối cùng không chỉ được thực hiện khi thực hiện tiếp tục bình thường mà còn khi một ngoại lệ bỏ chọn ngăn xếp như Smalltalk #ensure :. Xem các câu trả lời khác. –

5

Nếu bạn thực sự cần đến nó, bạn có thể thêm một giao thức để BlockClosure:

#on: anErrorOrSet do: errorBlock ensure: finallyBlock 
    [ self on: anErrorOrSet do: errorBlock ] 
    ensure: finallyBlock 

mà sẽ hoạt động giống như thử: catch: cuối cùng: trên java.

Đó là sự kỳ diệu của Smalltalk (tốt, một phần nhỏ của nó), nếu không có phù hợp cho nhu cầu của bạn, bạn luôn có thể mở rộng nó :)

1

Đây là cách bạn có thể viết nó ra khỏi hộp trong hầu hết các phương ngữ Smalltalk.

[[ "try{}" ] 
    on: Error 
    do: [:ex | "catch{}"]] 
     ensure: ["finally{}"] 

Hoặc bạn có thể mở rộng BlockClosure như @EstebanLM được khuyến nghị.

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