попробуй поймай наконец идиома в smalltalk - PullRequest
5 голосов
/ 20 октября 2011

Как вы понимаете идиому try-catch-finally в smalltalk? Я вижу, что есть on:do: и ensure:, но нет on:do:ensure:. Я должно быть что-то упустил.

Ответы [ 4 ]

6 голосов
/ 20 октября 2011

Вы можете заключить блок #on: do в другой блок, к которому прикреплен #ensure:.

5 голосов
/ 21 октября 2011

Если вам это действительно нужно, вы можете добавить в BlockClosure протокол:

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

, который будет вести себя так же, как try: catch: finally: на Java.

Это магияsmalltalk (ну, небольшая его часть), если нет соответствия вашим потребностям, вы всегда можете расширить его:)

1 голос
/ 21 октября 2011

Это то, как вы можете написать это из коробки практически на всех диалектах Smalltalk.

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

Или вы можете расширить BlockClosure в соответствии с рекомендациями @EstebanLM.

1 голос
/ 21 октября 2011

Я не уверен, что понял ваш вопрос, но если я понял, а вы имели в виду «как обработать исключение, если оно сработало, и в противном случае продолжить нормальное выполнение», это то, что вы можете сделать:

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

Проверьте все подклассы исключений, чтобы увидеть, какие исключения вы можете захватить.

Надеюсь, это помогло!

...