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
只是流产或退出就足够了......但是如果可能的话,我想用更多的"耀斑"来做这件事 - 并且以更加解释的方式......
最简单的方法是发出一般错误信号:
someVariable: anInteger
anInteger isInteger
ifFalse: [self error: 'must be an Integer'].
someVariable := anInteger
Run Code Online (Sandbox Code Playgroud)
现在,如果要发出特定错误信号,请执行以下操作:
Error
,比方说,NonIntegerArgument
像这样写你的代码
someVariable: anInteger
anInteger isInteger
ifFalse: [NonIntegerArgument signal: 'must be an Integer'].
someVariable := anInteger
Run Code Online (Sandbox Code Playgroud)要处理此异常,请执行以下操作
[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
问题的消息.