Exception handling 引发自定义错误/异常

Exception handling 引发自定义错误/异常,exception-handling,smalltalk,pharo,squeak,Exception Handling,Smalltalk,Pharo,Squeak,我在和Pharo玩游戏,想提出一个定制的错误/异常/什么,但我不知道怎么做。 我已经浏览了相关(我认为)章节的“法罗的例子”和“深入到法罗”;但我无法确定这一点-这似乎远远超出了我需要的水平 我有一个变量的setter,如果输入不是整数,我想引发一个错误/异常: MyClass >> someVariable: anInteger anInteger isInteger ifFalse: [ self SomehowProtestLoadly - the par

我在和Pharo玩游戏,想提出一个定制的错误/异常/什么,但我不知道怎么做。
我已经浏览了相关(我认为)章节的“法罗的例子”和“深入到法罗”;但我无法确定这一点-这似乎远远超出了我需要的水平

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

MyClass >> someVariable: anInteger anInteger isInteger ifFalse: [ self SomehowProtestLoadly - the part I don't know how to do ]. someVariable := anInteger MyClass>>某个变量:整数 整合器 ifFalse:[我不知道怎么做的部分]。 someVariable:=整数
只是中止或退出就足够了。。。但是如果可能的话,我想用更多的“flare”来做这件事——并且用更解释的方式…

最简单的方法就是发出一个通用错误的信号:

someVariable: anInteger
  anInteger isInteger
    ifFalse: [self error: 'must be an Integer'].
  someVariable := anInteger
现在,如果要发出特定错误的信号,请执行以下操作:

  • 创建
    Error
    的子类,比如说,
    NonIntegerArgument
  • 像这样编写代码

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

    [myObject someVariable: self value]
      on: NonIntegerArgument
      do: [:ex | self handleException: ex]
    
  • 请注意,您的异常可以提供更多信息,比如发送的实际参数。为此,向
    非整数参数
    类添加一个实例变量,即
    参数
    。为它添加一个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
    变量将能够响应有问题消息的
    参数。

    请注意,字符串
    “必须是整数”
    足够通用,可以在
    非整数参数
    类中编码为默认消息,而不是在每个客户端重复。传递特定于客户端的字符串的选项最终是否可用,取决于OP决定。@aka.nice Good point。事实上,一旦为异常创建了特定的类,就可以添加更多的默认行为,将代码从客户端移动到异常对象。