提出一个自定义 error/exception

Raising a customized error/exception

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

我有一个变量 setter,如果输入不是整数,我想提出一个 error/exception:


    MyClass >> someVariable: anInteger
       一个整数是整数
          ifFalse: [ self SomehowProtestLoadly - 我不知道该怎么做的部分]。
       一些变量 := 一个整数

只是中止或退出就足够了...但如果可能的话,我想多做一点 "flare" - 并以一种更具解释性的方式...

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

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

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

  1. 创建 Error 的子class,比如说,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]
    

请注意,您的异常可以提供更多信息,比如发送的实际参数。为此,将一个实例变量添加到您的 NonIntegerArgument class,即 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 进行响应。