2011-10-20 19 views

Respuesta

6

Puede ajustar el bloque #on: do en otro bloque que tenga #ensure: conectado.

+0

Ah de hecho. Lo pensé pero de alguna manera pensé que ejecutaría el bloque interno dos veces, porque tanto #on: do: y #ensure: send #value. – milan

+1

'#ensure:' el envío de '# value' evaluará su contenido, que enviará' #on: do: 'a su contenido, que a su vez enviará' # value' al bloque más interno, que finalmente haz algo útil. En otras palabras, los dos envíos '# value' se envían a diferentes bloques. –

1

No estoy seguro de haber entendido su pregunta, pero si lo hiciera y que quería decir "¿cómo se puede controlar una excepción si se activa y continuar la ejecución normal de lo contrario", esto es lo que puede hacer:

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

Consulte todas las subclases de Excepción para ver qué tipo de excepciones puede capturar.

Espero que haya sido útil.

+0

El bloque finally no solo se ejecuta cuando la ejecución continúa normalmente sino también cuando una excepción desenrolla la pila como Smalltalk #ensure :. Ver otras respuestas –

5

Si realmente lo necesita, se puede añadir un protocolo para BlockClosure:

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

que se comporta exactamente igual que intento de captura: por último: en java.

Esa es la magia de Smalltalk (bueno, una pequeña parte de ella), si no hay ninguna coincidencia para sus necesidades, siempre se puede extender :)

1

Así es como se puede escribir fuera de la caja en casi todos los dialectos de Smalltalk.

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

O puede ampliar BlockClosure como @EstebanLM recomendado.