smalltalk错误处理

mil*_*lan 9 error-handling smalltalk

我已经阅读了一些初学者对smalltalk的介绍,并且有一个主题缺失.这是错误处理.怎么做?对象会抛出某种异常吗?向某人发送一些错误消息?

Fra*_*rar 22

提出异常:

MyException signal.
MyException signal: 'With an error message'.
Run Code Online (Sandbox Code Playgroud)

处理异常:

[ 1 / 0 ] on: ZeroDivide do: [ Transcript showln: 'Oops! Zero divide!'].
Run Code Online (Sandbox Code Playgroud)

要处理异常并使用一些异常信息:

[ 1 / 0 ] on: Error do:
    [:e | Transcript showln: 'Oops! ' , e className , '!'].
Run Code Online (Sandbox Code Playgroud)

为了确保始终发生某事(a la try finally):

[ 1 / 0 ] ensure: [ Transcript showln: 'This will always run' ]
Run Code Online (Sandbox Code Playgroud)


mat*_*thk 7

我只是想指出,除了@Frank Shearar提到的另一种可能性之外.我的意思是设计.现在让调用者现在遇到什么麻烦更有用了.

#on:do:是完全可以接受的,但大多数时候你不知道该把什么作为第一个论点. block on: ?? do: something.

让我举个例子.实际上,Collection库中有一个例子.特别是关于字典.

aDict at: 4
Run Code Online (Sandbox Code Playgroud)

如果4不在字典中会发生什么.你只需得到一个简单的错误,你需要捕获一个#on:do:.

但有一种更好的方法来处理这种情况:

aDict at: 4 ifAbsent: [^#noSuchThingAs4]
Run Code Online (Sandbox Code Playgroud)

你处理的错误与#on:do:现在一样,但现在你知道为什么了.所以你可以在其他方面做到这一点,以正确处理你的错误.

aConnection connectIfFailed: [ ^#maybeRetryHere ]
Run Code Online (Sandbox Code Playgroud)

请注意,您需要将异常代码放在一个块中,以便在发生错误之前不会对其进行评估.

aDict at: 4 ifAbsentPut: self default
Run Code Online (Sandbox Code Playgroud)

可能会奏效,但这是错误的.希望对你有所帮助.