引发自定义错误/异常

5
我正在使用Pharo进行尝试,并希望引发自定义错误/异常/其他,但我不知道如何做。
我已经浏览了《Pharo by Example》和《Deep into Pharo》的相关章节;但是我无法理解 - 它似乎远高于我需要的水平...
我有一个变量的setter,并且希望在输入不是整数时引发错误/异常:
    MyClass >> someVariable: anInteger
       anInteger isInteger
          ifFalse: [ self SomehowProtestLoadly - 我不知道如何做 ].
       someVariable := anInteger

只需中止或退出即可...但如果可能的话,我想以更加生动有趣的方式做到这一点 - 并以更加详细的方式...
1个回答

6

最简单的方法是只报告一个通用错误:

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

现在,如果您想表示特定的错误,请按照以下步骤进行:
  1. Create a subclass of Error, say, NonIntegerArgument
  2. Write your code like this

    someVariable: anInteger
      anInteger isInteger
        ifFalse: [NonIntegerArgument signal: 'must be an Integer'].
      someVariable := anInteger
    
  3. For handling this exception do the following

    [myObject someVariable: self value]
      on: NonIntegerArgument
      do: [:ex | self handleException: ex]
    
请注意,您的异常信息可能提供更多信息,比如实际发送的参数。为此,请在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将能够响应有问题消息的参数

1
请注意,字符串“'必须是整数'”足够通用,可以编码为NonIntegerArgument类中的默认消息,而不是在每个客户端重复。传递客户特定字符串的选项最终可能有用或无用,由OP决定。 - aka.nice
1
@aka.nice 很好的观点。确实,一旦您为异常定义了特定的类,您可以将许多默认行为从客户端移动到异常对象中。 - Leandro Caniglia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接