提出自定义错误/异常

Baa*_*rud 4 smalltalk exception-handling squeak pharo

我正在玩Pharo,并想提出一个自定义的错误/异常/东西,但我不知道如何.
我浏览了"Pharo by Example"和"Deep into Pharo"的相关章节(我认为); 但无法对它做出正面或反面 - 它似乎高于我需要的水平......

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


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

只是流产或退出就足够了......但是如果可能的话,我想用更多的"耀斑"来做这件事 - 并且以更加解释的方式......

Lea*_*lia 5

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

someVariable: anInteger
  anInteger isInteger
    ifFalse: [self error: 'must be an Integer'].
  someVariable := anInteger
Run Code Online (Sandbox Code Playgroud)

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

  1. 创建一个子类Error,比方说,NonIntegerArgument
  2. 像这样写你的代码

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

    [myObject someVariable: self value]
      on: NonIntegerArgument
      do: [:ex | self handleException: ex]
    
    Run Code Online (Sandbox Code Playgroud)

请注意,您的异常可以提供更多信息,比如发送的实际参数.为此,请向您的NonIntegerArgument类添加一个实例变量,即argument.为它添加一个getter和setter.然后

NonIntegerArgument class >> #signal: aString argument: anObject
  ^self new
    argument: anObject;
    signal: aString
Run Code Online (Sandbox Code Playgroud)

并以这种方式使用它

someVariable: anInteger
  anInteger isInteger
    ifFalse: [
      NonIntegerArgument
        signal: 'must be an Integer'
        argument: anInteger].
  someVariable := anInteger
Run Code Online (Sandbox Code Playgroud)

现在,该ex变量将能够响应有argument问题的消息.