2011-10-20 13 views

cevap

6

#on: Buradaki #ensure: ekine sahip başka bir satırda blok yapın.

+0

Ah gerçekten de. Bunu düşündüm ama her nasılsa iç bloğu iki kez çalıştıracağını düşündüm, çünkü her ikisi de #on: do: ve #ensure: # value gönder. – milan

+1

'#ensure:' '' değeri '' gönderen, içeriğini #on: do: 'olarak gönderecek olan içeriğini değerlendirecek ve bu da sonuç olarak en son bloğu en sondaki bloğa gönderecektir. Kullanışlı bir şeyler yap. Diğer bir deyişle, iki '# 'değeri farklı bloklara gönderilir. –

1

Ben sorunuzu anladım, ama ben yaptım ve "o tetiklenir eğer nasıl bir istisna ele alır ve aksi takdirde normal yürütme devam" anlamına eğer, bu ne yapabileceğini olduğundan emin değilim:

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

Yakalayabileceğiniz istisna türlerini görmek için İstisna'nın tüm alt sınıflarına bakın.

Yardım edin!

+0

Sonuncu blok, yalnızca yürütme normal olarak devam ettiğinde değil, aynı zamanda bir istisna Smalltalk #ensure: gibi yığını açtığı zaman yürütülür. Diğer cevapları gör. –

5

gerçekten ihtiyacınız varsa, BlockClosure bir protokol ekleyebilirsiniz: catch: nihayet: java sadece denemede gibi davranır edecek

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

. ihtiyaçlarınız için herhangi bir eşleşme varsa, Smalltalk büyüsünü (iyi, bunun küçük bir parçası) bulunuyor

, her zaman uzatabilirsiniz :)

1

Bu kutunun dışına yazabilirsiniz nasıl neredeyse tüm Smalltalk lehçelerinde.

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

Veya @EstebanLM önerildiği gibi BlockClosure uzatabilirsiniz.