[英]Smalltalk Error handling with Transcript
假設我有以下方法:
MyClass>>addCategory: aCategory toEvent: anEvent
| cat |
cat := anEvent addCategory: aCategory
...
現在,方法#addCategory
可以返回其他一些對象(例如Foo
類),也可以引發錯誤(使用Error signal: 'message'
)。
Transcript show: 'Category added!'
)並返回該對象。 我一直在看aBlock ifError: aBlock
,像這樣:
MyClass>>addCategory: aCategory toEvent: anEvent
| cat |
cat := [anEvent addCategory: aCategory] ifError: [ :err | Transcript show: err. ]
...
但是我不太清楚后來如何處理可變cat
,以便獲得我想要的行為。
這是另一種方法。 想法是將您的代碼封裝起來,好像不會失敗,並用on: Error
包裹on: Error
MyClass>>addCategory: aCategory toEvent: anEvent
| cat |
[
cat := anEvent addCategory: aCategory.
Transcript show: 'Category added!']
on: Error
do: [:err | Transcript show: err messageText].
^cat
請注意,在發生Error
情況下不會分配cat
,因此該方法將以nil
回答。 還要注意,在錯誤處理程序塊內無需^nil
。
請記住, on:do:
的想法是允許您編寫朴素的代碼,然后處理可能的錯誤情況,而無需將它們內聯到代碼的無錯誤部分。
[
<my naive
and clean
lines of code>] on: Error do: [:err | oops!]
您的解決方案是可以的,但可以在主代碼中內嵌錯誤處理代碼,這會使讀者更難理解相關代碼的主要思想。
解決此問題的一種可能方法如下:
MyClass>>addCategory: aCategory toEvent: anEvent
| cat |
cat := [ anEvent addCategory: aCategory] on: Error do [ :err | Transcript show: err messageText. ^nil. ]
Transcript show: 'Category added!'.
^cat
此解決方案會將錯誤輸出到“成績單”,並從該方法返回nil
。 如果沒有錯誤,代碼將繼續,在“成績單”上打印消息並返回對象。
這可能不是最好的解決方案,但這是一種可行的方法。 只要您不介意錯誤時返回nil
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.