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)
我只是想指出,除了@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)
可能会奏效,但这是错误的.希望对你有所帮助.