提出自定义错误/异常

时间:2017-10-30 15:04:20

标签: exception-handling smalltalk pharo squeak

我和Pharo一起玩,想提出一个定制的错误/异常/东西,但我不知道怎么做。
我已经浏览了#34; Pharo by Example"的相关(我认为)章节。和#34;深入Pharo&#34 ;;但无法对此做出正面或反面 - 它似乎超出了我所需的水平......

我有一个变量的setter,如果输入不是整数,我想提出错误/异常:


    MyClass >> someVariable: anInteger
       anInteger isInteger
          ifFalse: [ self SomehowProtestLoadly - the part I don't know how to do ].
       someVariable := anInteger

只要中止或退出就足够了......但是如果可能的话,我想再多做一次" flare" - 并以更具说明性的方式......

1 个答案:

答案 0 :(得分:5)

最简单的方法是发出一般错误信号:

someVariable: anInteger
  anInteger isInteger
    ifFalse: [self error: 'must be an Integer'].
  someVariable := anInteger

现在,如果您想发出特定错误的信号,请执行以下操作:

  1. 创建Error的子类,比如NonIntegerArgument
  2. 像这样编写代码

    someVariable: anInteger
      anInteger isInteger
        ifFalse: [NonIntegerArgument signal: 'must be an Integer'].
      someVariable := anInteger
    
  3. 要处理此异常,请执行以下操作

    [myObject someVariable: self value]
      on: NonIntegerArgument
      do: [:ex | self handleException: ex]
    
  4. 请注意,您的异常可以提供更多信息,比如发送的实际参数。为此,请将实例变量添加到NonIntegerArgument类,即argument。为它添加一个getter和setter。然后

    NonIntegerArgument class >> #signal: aString argument: anObject
      ^self new
        argument: anObject;
        signal: aString
    

    并以这种方式使用

    someVariable: anInteger
      anInteger isInteger
        ifFalse: [
          NonIntegerArgument
            signal: 'must be an Integer'
            argument: anInteger].
      someVariable := anInteger
    

    现在,ex变量将能够使用违规邮件的argument进行回复。