捕获并处理(不同)同一块的不同异常,并确保

时间:2019-06-17 15:45:03

标签: exception pharo

我从the MOOC documentation得知,对于在某些代码段中可能发生的多个异常,可以使用相同的处理程序,例如:

[ 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 个答案:

答案 0 :(得分:1)

It seems it's possible使用嵌套块:

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

答案 1 :(得分:1)

尝试将此方法添加到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]]

请注意,exception1exception2可以是Exception的子类或ExceptionSet的实例(用#,创建)。