Поймать и обработать (по-разному) разные исключения для одного и того же блока с гарантией - PullRequest
1 голос
/ 17 июня 2019

Я знаю из документации MOOC , что можно иметь один и тот же обработчик для нескольких исключений, которые могут возникать во время какого-то блока, например ::100100

[ do some work ]
on: ZeroDivide, Warning
do: [ :ex | what you want ]

В том же документе есть пример с ensure, чтобы убедиться, что код всегда выполняется (несмотря на любые исключения):

[ doSomething ] ensure: [ alwaysExecuteThis ]

Однако я бы хотел что-то вроде:

[ do some work ]
on: ZeroDivide
do: [ :zeroDivide | handle it ]
on: Warning
do: [ :warning | handle it ]
ensure: [ alwaysExecuteThis ]

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

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Попробуйте добавить этот метод к BlockClosure:

on: exception1
do: block1
on: exception2
do: block2
  ^self on: exception1 , exception2 do: [:ex |
    (exception1 handles: ex)
      ifTrue: [block1 value: ex]
      ifFalse: [block2 value: ex]]

Обратите внимание, что exception1 и exception2 могут быть подклассами Exception или экземплярами ExceptionSet (созданными с #,).

1 голос
/ 17 июня 2019

Кажется возможным использовать вложенные блоки:

[ [ [ [ doSomething here ]
    on: ZeroDivide
    do: [ :zeroEx | 'zeroExc' crLog ] ]
    on: Warning
    do: [ :warning | 'warning' crLog ] ]
    ensure: [ 'ensure' crLog ] ]
...