Error handling smalltalk错误处理

Error handling smalltalk错误处理,error-handling,smalltalk,Error Handling,Smalltalk,我已经读了一些smalltalk的初学者介绍,但有一个主题遗漏了。这是错误处理。怎么做的?对象是否抛出某种异常?向某人发送一些错误消息?引发异常: MyException signal. MyException signal: 'With an error message'. [ 1 / 0 ] on: ZeroDivide do: [ Transcript showln: 'Oops! Zero divide!']. 要处理异常,请执行以下操作: MyException signal. M

我已经读了一些smalltalk的初学者介绍,但有一个主题遗漏了。这是错误处理。怎么做的?对象是否抛出某种异常?向某人发送一些错误消息?

引发异常:

MyException signal.
MyException signal: 'With an error message'.
[ 1 / 0 ] on: ZeroDivide do: [ Transcript showln: 'Oops! Zero divide!'].
要处理异常,请执行以下操作:

MyException signal.
MyException signal: 'With an error message'.
[ 1 / 0 ] on: ZeroDivide do: [ Transcript showln: 'Oops! Zero divide!'].
要处理异常并使用某些异常信息,请执行以下操作:

[ 1 / 0 ] on: Error do:
    [:e | Transcript showln: 'Oops! ' , e className , '!'].
要确保总是发生某些事情(请最后尝试):


我只想指出,除了@Frank Shearr提到的方式之外,还有另一种可能性。我指的是设计。有时更有用的方法是让打电话的人知道会有什么麻烦

关于:do:的
#是完全可以接受的,但是大多数时候你不知道应该把什么作为第一个参数<代码>阻止:??做点什么

让我举个例子。实际上,这里有一个来自集合库的示例。尤其是关于字典

aDict at: 4
如果字典中没有
4
,会发生什么情况。您只需要在一个
#on:do:
中捕获一个简单的错误

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

aDict at: 4 ifAbsent: [^#noSuchThingAs4]
您处理错误的方式与:do:上的
#相同,但现在您知道了原因。
所以你可以在其他地方这样做来正确处理你的错误

aConnection connectIfFailed: [ ^#maybeRetryHere ]
请注意,您需要将异常代码放入一个块中,以便在错误发生之前不会对其进行计算

aDict at: 4 ifAbsentPut: self default

可能有用,但它是错误的。希望能对您有所帮助。

阅读《Pharo By Example 2》一章:

好的方面:错误处理常常以ifAbsent的方式被烘焙到API中。