2011-01-29 33 views
8

我讀過一些初學者對smalltalk的介紹,並且有一個主題缺失。這是錯誤處理。它是如何完成的?對象是否會拋出某種異常?向某人發送一些錯誤消息?smalltalk錯誤處理

回答

19

引發異常:

MyException signal. 
MyException signal: 'With an error message'. 

處理異常:

​​

處理異常和使用的一些異常的信息:

[ 1/0 ] on: Error do: 
    [:e | Transcript showln: 'Oops! ' , e className , '!']. 

爲了確保東西總是發生(a la try finally):

[ 1/0 ] ensure: [ Transcript showln: 'This will always run' ] 
5

我只想指出,除了@Frank Shearar之外,還有其他的可能性。我的意思是設計。有時讓主叫方現在發生什麼麻煩會更有用。

#on:do:是完全可以接受的,但大多數時候你不知道該把什麼作爲第一個參數。 block on: ?? do: something

讓我來舉個例子吧。實際上,Collection庫有一個例子。特別是關於字典。

aDict at: 4 

這裏發生了什麼,如果4不在字典中。你只是得到一個普通的錯誤,你需要趕上#on:do:

但是有一個更好的方式來處理這種情況:

aDict at: 4 ifAbsent: [^#noSuchThingAs4] 

您是處理錯誤一樣#on:do:但現在你知道爲什麼。 所以你可以在其他方面做到這一點,以妥善處理你的錯誤。

aConnection connectIfFailed: [ ^#maybeRetryHere ] 

請注意,您需要將異常代碼放在塊中,以便在發生錯誤之前不會對其進行評估。

aDict at: 4 ifAbsentPut: self default 

可能工作,但它是錯誤的。希望能幫到你。

+1

好一點:錯誤處理的往往烤成的ifAbsent方式的API。 – 2011-01-29 20:25:19